简单的应用程序委托方法显示一个UIAlertController(在Swift中)

在obj-C中,当另一个iOS应用程序(邮件附件,网页链接)被点击与我的应用程序相关的文件或链接。 然后,我会在openURL或didFinishLaunchingWithOptions上捕获这个,并显示一个UIAlertView来确认用户想要导入数据。 现在, UIAlertView贬值,我正在尝试做同样的事情,但不是真的确定最好的方式来做到这一点?

我的应用程序从另一个应用程序接收数据时,显示简单的警报时遇到问题。 这个代码在Objective-C中使用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; } 

但是,当我尝试切换到UIAlertViewController和Swift我似乎无法find一个简单的方法来显示消息:

 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 } 

我得到一个编译时错误, AppDelegate没有一个名为presentViewController的成员

我已经看到了一些令人费解的方法来让AppDelegate在StackOverflow上显示一个UIAlertViewController ,但我希望有一些简单的东西。

我真正需要做的是向用户显示一个简短的信息,告诉他们他们得到了一些数据,然后决定他们想要做什么。 一旦完成,我的应用程序将继续打开并进入前台(类似的代码在didFinishLaunchingWithOptions冷启动)与新的数据添加或不基于警报select。

我可以标记一个全局variables,我检查我的所有viewWillAppear函数,但是这将是很多重复,因为我有30多个视图。

如果您有任何想法,请告诉我。

谢谢

格雷格

尝试使用

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

所有你需要的是一个viewController对象来显示AlertController。

使用此代码从appdelegate启动alertCV

  dispatch_async(dispatch_get_main_queue(), { let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet) self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil) }) 

希望这可以帮助!

我发现的最好的方法如下:

  let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet) //.Alert .ActionSheet var hostVC = UIApplication.sharedApplication().keyWindow?.rootViewController while let next = hostVC?.presentedViewController { hostVC = next } hostVC?.presentViewController(importantAlert, animated: true, completion: nil) let delay = 1.5 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue()) { importantAlert.dismissViewControllerAnimated(true, completion: nil) return } 

我已经添加了一个定时器,所以UIAlertController被解散,因为它没有任何button。

感谢: https ://stackoverflow.com/a/33128884/6144027关于如何从AppDelegate展示一个UIAlertController的明智的答案。

从应用程序代表内部。

window.rootViweController.presentViewController..

Swift 3中接受的答案可以帮助任何人:

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