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, davel...@mac.com 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 >> <cocoa-dev@lists.apple.com> 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 <david.dun...@apple.com> 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 <bc...@lafn.org> 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 <david.dun...@apple.com> >>>>> 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 >>>>>> <cocoa-dev@lists.apple.com> 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 (Cocoa-dev@lists.apple.com) >>>>>> >>>>>> 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: >>>>>> https://lists.apple.com/mailman/options/cocoa-dev/david.duncan%40apple.com >>>>>> >>>>>> This email sent to david.dun...@apple.com >>>>> >>>> >>> >> >> _______________________________________________ >> >> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) >> >> 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: >> https://lists.apple.com/mailman/options/cocoa-dev/davelist%40mac.com >> >> This email sent to davel...@mac.com > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com