在我正在进行的项目中,我必须编写一个UIAlert帮助程序模块,它可以在我的iOS应用程序中显示弹出窗口。弹出窗口是作为类函数编写的,我可以简单地在代码中的任何地方调用(类是静态的,所有函数也是如此)。
我现在遇到一个非常奇怪的错误,如果你一次解除警报,然后再打开它,它的动作就不再起作用了(因为没有调用动作处理程序)。如果您在第一次显示弹出窗口时单击该操作,它确实有效,但是......
以下是发生此错误的特定弹出窗口的代码(没有其他弹出窗口受到影响):
static func popSkipWalkthrough() {
let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert)
alert.addAction(cancelAction)
alert.addAction(skipWalkthroughAction)
appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil)
}
skipWalkthroughAction
定义如下:
static let skipWalkthroughAction = UIAlertAction(title: "Continue", style: .Default, handler: { (action: UIAlertAction!) -> Void in
appDelegate.setWindowViewTo("NavCtrl", navigateTo: false)
CallIn.Settings.didWalkthrough = true
})
cancelAction
定义为:
static let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
每次在漫游的最后一步按“跳过”按钮时,都会显示此弹出窗口...
我已经尝试了一些关于这种行为的原因,并且我认为它可能与弹出窗口没有真正被解除分配有关,但我现在还不确定...... < / p>
有什么想法吗?
答案 0 :(得分:4)
虽然我对此可重用片段的编码方式存在问题,但可以通过向copy:
发送skipWalkthroughAction
消息来解决此问题。只需做一个:
static func popSkipWalkthrough() {
let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert)
alert.addAction(cancelAction.copy() as! UIAlertAction)
alert.addAction(skipWalkthroughAction.copy() as! UIAlertAction)
appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil)
}
这应该解决它。
您也可以通过将alert
移动到实例级别来解决此问题。您不必发送copy:
。
更好的方法
如果您希望获得UIAlertController
的“真正”可重复使用体验,则最好创建UIViewController
扩展程序。我在我的一个项目中有这个:
extension UIViewController {
func showAlertControllerWithTitle(title:String?,message:String?,actions:[UIAlertAction],dismissingActionTitle:String?, dismissBlock:(() -> ())?) -> UIAlertController {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
if dismissingActionTitle != nil {
let okAction = UIAlertAction(title: dismissingActionTitle, style: .Default) { (action) -> Void in
dismissBlock?()
alertController.dismissViewControllerAnimated(true, completion:nil)
}
alertController.addAction(okAction)
}
for action in actions {
alertController.addAction(action)
}
self.presentViewController(alertController, animated: true, completion:nil)
return alertController
}
}