Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple App Delegate method to show an UIAlertController (in Swift)

In obj-C when another iOS app (mail attachment, web link) was tapped with a file or link associated with my app. I would then catch this on openURL or didFinishLaunchingWithOptions and show a UIAlertView to confirm the user wants to import the data. Now that UIAlertView is depreciated I am trying to do the same thing but not really sure about the best way to do this?

I am having trouble showing a simple alert when my App receives data from another app. This code worked fine in Objective-C with a UIAlertView:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {     if (url)     {         self.URLString = [url absoluteString];         NSString *message = @"Received a data exchange request. Would you like to import it?";         importAlert = [[UIAlertView alloc] initWithTitle:@"Data Received" message:message delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];         [importAlert show];     }      return YES; } 

But when I try and switch to UIAlertViewController and Swift I can't seem to find a simple way to display the message:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {     let URLString: String = url.absoluteString!     let message: String = "Received data. Would you like to import it?"      var importAlert: UIAlertController = UIAlertController(title: "Data Received", message: message, preferredStyle: UIAlertControllerStyle.Alert)     importAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))     importAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:     { action in         switch action.style {         case .Default:             println("default")           case .Cancel:             println("cancel")            case .Destructive:             println("destructive")         }     }))      self.presentViewController(importAlert, animated: true, completion: nil)     return true } 

I get a compile time error that AppDelegate does not have a member named presentViewController

I have seen some convoluted methods to get the AppDelegate to display an UIAlertViewController on StackOverflow but I was hoping there was something a little simpler.

All I really need to do is show the user a quick message that they got some data and have them decide what they want to do with it. Once were done my app will continue to open and come to foreground (similar code in didFinishLaunchingWithOptions for cold start) with either the new data added or not based on the alert selection.

I could flag a global variable that I check in all my viewWillAppear func but this would be a lot of duplication since I have 30+ views.

Let me know if you have any ideas.

Thanks

Greg

like image 661
Greg Robertson Avatar asked Oct 29 '14 10:10

Greg Robertson


People also ask

How do I present an alert in Swift?

To show an alert, create some Boolean state that determines whether the alert should be visible, then attach that to an alert() modifier along with all the buttons you want to show in the alert. All buttons dismiss the alert when tapped, so you can provide an empty action for simple dismissal.

What is app delegate and methods in Swift?

The app delegate is effectively the root object of your app, and it works in conjunction with UIApplication to manage some interactions with the system. Like the UIApplication object, UIKit creates your app delegate object early in your app's launch cycle so it's always present.

What is the difference between AppDelegate and SceneDelegate in Swift?

AppDelegate is responsible for handling application-level events, like app launch and the SceneDelegate is responsible for scene lifecycle events like scene creation, destruction and state restoration of a UISceneSession.


1 Answers

Try using

self.window?.rootViewController?.presentViewController(importAlert, animated: true, completion: nil) 

All you need is a viewController object to present the AlertController from.

In Swift 4:

self.window?.rootViewController?.present(importAlert, animated: true, completion: nil) 
like image 193
ZeMoon Avatar answered Sep 29 '22 17:09

ZeMoon