解雇UIAlertController(最佳实践)

Woo*_*ock 12 delegates ios swift

当像这样使用UIAlertController时:

var alert = UIAlertController(title: "Core Location", 
     message: "Location Services Disabled!", 
     preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, 
     handler: nil))
self.navigationController.presentViewController(alert, animated: true, 
     completion: nil)
Run Code Online (Sandbox Code Playgroud)

我注意到警报视图的解雇似乎是自动完成的.不应该通过委托调用呈现ViewController来解雇呈现的 ViewController吗?

Mun*_*ndi 6

解雇被"包括"在presentViewController电话中.您不需要委托,因为您有完成块.在这个块中,您将通常放入委托回调中的内容放入,除了取消警报的调用.

就"最佳实践"而言,我注意到在许多API中,Apple用完成块替换了委托回调.Apple通常建议使用块语法.我推测这可能部分是因为它有助于将相关的代码段保持在一起.

  • 这个答案可以解释为暗示在解除警报时调用`presentViewController:animated:completion`方法的`completion`闭包.如果你这样读,请注意事实并非如此.正如[docs](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion :)所说:"在显示的视图控制器上调用viewDidAppear:方法后调用完成处理程序".即它与解雇无关 (11认同)
  • 在iOS 9(也可能是iOS 8)中,`-presentViewController:animatedView:`的`completion`块在UIAlertController首次出现后执行.如果你需要回调用户何时解除警报控制器,那么提供一个类型为"UIAlertActionStyleCancel"的UIAlertAction,并将你的代码放在该对象的`handler`中.当通过点击弹出窗口外部或点击取消按钮解除警报控制器时,它将执行. (4认同)
  • 不,此方法的“completion”参数用于在呈现视图控制器的动画完成后进行“回调”。这是有道理的——非模态视图控制器可以无限期地保持状态。我同意这可能会令人困惑,但请注意,该参数不称为“完成”,而是“处理程序”,表明存在这一重要区别。 (2认同)