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 > <cocoa-dev@lists.apple.com> 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, 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/zav%40mac.com > > This email sent to z...@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