Re: Alerts in Xcode 11
Re: Alerts in Xcode 11
- Subject: Re: Alerts in Xcode 11
- From: Doug Hardie via Cocoa-dev <email@hidden>
- Date: Wed, 16 Oct 2019 16:00:21 -0700
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