简单的应用程序委托方法显示一个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)