Re: Alerts in Xcode 11
Re: Alerts in Xcode 11
- Subject: Re: Alerts in Xcode 11
- From: Alex Zavatone via Cocoa-dev <email@hidden>
- Date: Wed, 16 Oct 2019 19:50:02 -0500
Yeah, one thing you need to do is get the key window’s presentedViewController.
You can do this from the shared applicationDelegate. Create a standalone
class that gets UIApplication.shared().keywindow.presentedViewController.
Think of that as self. And then use that to present the alert. Add a weak
reference back to whichever object you need to do stuff when buttons are
pressed in that alert.
Hope this helps.
> On Oct 16, 2019, at 6:00 PM, Doug Hardie via Cocoa-dev
> <email@hidden> wrote:
>
> I finally got some time to get back to this again. The extension does a lot
> of what I need. It works great if it is called from any UIViewController.
> However, if I call it from a function that is not in a view controller then
> Swift says notificationAlert is not defined. There is another side effect
> that is more problematic, When the alert is displayed, I also get the message:
>
> popViewControllerAnimated: called on <UINavigationController 0x7fc376813c00>
> while an existing transition or presentation is occurring; the navigation
> stack will not be updated.
>
> Generally these alerts are used when a user tries to enter a view controller
> where the prerequisite data has not been provided. I wanted the alert to
> display and then go back to the previous view controller. I suspect that I
> will need to use completions in the notificationAlert function to do that
> rather than just following the call with the stack pop.
>
> -- Doug
>
>> On 9 October 2019, at 07:40, email@hidden wrote:
>>
>> I'm by no means an expert but if I understand what you're trying to do, I
>> think the approach I would take is to make an extension on UIViewController:
>>
>> extension UIViewController {
>> func notificationAlert(_ msg1: String, _ msg2: String) {
>>
>> // create the UIAlertAlertController
>> // and then do as David Duncan said and do:
>> self.present(<alert controller>, animated: <true/false> completion: …)
>> }
>> }
>>
>> Now all your UIViewController subclasses can call that method (and because
>> it's a method, they have access to self which is a subclass of
>> UIViewController).
>>
>> HTH,
>> Dave
>>
>>
>>> On Sep 30, 2019, at 11:27 PM, Doug Hardie via Cocoa-dev
>>> <email@hidden> wrote:
>>>
>>> I tried that and swift complains that self is not defined. This is not in
>>> a view controller but a stand alone function used in many view controllers.
>>> Generally it is used during a segue, but I added one in a view controller
>>> to a button action, not part of a segue and it dismissed the alert also.
>>>
>>> -- Doug
>>>
>>>> On 30 September 2019, at 19:48, David Duncan <email@hidden>
>>>> wrote:
>>>>
>>>> Instead of creating a new window and a root view controller in order to
>>>> present your alert, just use (assuming self is a UIViewController)
>>>> self.present(<alert controller>, animated: <true/false> completion: …)
>>>>
>>>>> On Sep 30, 2019, at 5:48 PM, Doug Hardie <email@hidden> wrote:
>>>>>
>>>>> Not sure how to do that. It's not in any view controller as it is used
>>>>> in virtually all of the various view controllers. That's why I wanted it
>>>>> as a function.
>>>>>
>>>>> -- Doug
>>>>>
>>>>>> On 30 September 2019, at 14:44, David Duncan <email@hidden>
>>>>>> wrote:
>>>>>>
>>>>>> What happens if you present it over your normal view controller
>>>>>> hierarchy instead of using another window?
>>>>>>
>>>>>> Has your application adopted UIWindowScene?
>>>>>>
>>>>>>> On Sep 30, 2019, at 5:36 PM, Doug Hardie via Cocoa-dev
>>>>>>> <email@hidden> wrote:
>>>>>>>
>>>>>>> I have some code that presents an alert to the user with information
>>>>>>> they need, and an OK button to clear it. It works fine in the previous
>>>>>>> Xcode versions. However, after upgrading to 11, it now displays the
>>>>>>> alert and then immediately clears it. This happens both in the
>>>>>>> simulator and on a real device. I have played around with the code and
>>>>>>> can't figure out how to make it leave the alert on the screen. This is
>>>>>>> in Swift. It is a function that is called from numerous places in the
>>>>>>> app.
>>>>>>>
>>>>>>> func NotificationAlert (_ msg1: String, _ msg2: String) {
>>>>>>> let ErrorAlert = UIAlertController(title: msg1, message: msg2,
>>>>>>> preferredStyle: .alert)
>>>>>>> let dismiss = UIAlertAction(title: "Ok", style: .default, handler: nil)
>>>>>>> ErrorAlert.addAction(dismiss)
>>>>>>> ErrorAlert.presentInOwnWindow(animated: true, completion: nil)
>>>>>>> }
>>>>>>>
>>>>>>> extension UIAlertController {
>>>>>>> func presentInOwnWindow(animated: Bool, completion: (() -> Void)?) {
>>>>>>> let alertWindow = UIWindow(frame: UIScreen.main.bounds)
>>>>>>> alertWindow.rootViewController = UIViewController()
>>>>>>> alertWindow.windowLevel = UIWindow.Level.alert + 1;
>>>>>>> alertWindow.makeKeyAndVisible()
>>>>>>> alertWindow.rootViewController?.present(self, animated: animated,
>>>>>>> completion: completion)
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> -- Doug
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>>
>>>>>>> Cocoa-dev mailing list (email@hidden)
>>>>>>>
>>>>>>> Please do not post admin requests or moderator comments to the list.
>>>>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>>>>>
>>>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>>>
>>>>>>> This email sent to email@hidden
>>>>>>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>>
>>> Cocoa-dev mailing list (email@hidden)
>>>
>>> Please do not post admin requests or moderator comments to the list.
>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>> This email sent to email@hidden
>>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden