IOS Swift处理全局事件
如何处理通知中心触发的全局事件(例如,在我的API类中)如果收到错误响应(例如(500)),则触发事件。 当事件被触发时,UIAlert应该显示在什么视图控制器处于活动状态,或者在注销时应该呈现login视图控制器。
据我所见,有没有简单的方法来获取当前的视图控制器,以便与之交互。 (请注意,我的根视图控制器不是一个导航控制器)。
这样太难得到当前的视图控制器(当不使用导航控制器)?
// on your app delegate getCurrentViewController(self.window!.rootViewController!) func getCurrentViewController(viewController:UIViewController)-> UIViewController{ if let navigationController = viewController as? UINavigationController{ return getCurrentViewController(navigationController.visibleViewController) } if let viewController = viewController?.presentedViewController { return getCurrentViewController(viewController) }else{ return viewController } }
另一种解决scheme,无论你的视图控制器是否embedded在UINavigationController
,都可以工作,这是UIViewController
子类。 这个类将处理接收发生错误的NSNotification
,并将处理显示警报:
class MyViewController: UIViewController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) NSNotificationCenter.defaultCenter().addObserver(self, selector: "errorOccured", name: "ErrorNotification", object: nil) } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) NSNotificationCenter.defaultCenter().removeObserver(self, name: "ErrorNotification", object: nil) } func errorOccured() { // Present an UIAlertViewController or the login screen. } }
现在,在发布错误通知时应该显示警报的任何UIViewController
都必须是MyViewController
的子类。 只要确保,如果你重写viewWillAppear
或viewWillDisappear
,你可以调用super.viewWillAppear
或super.viewWillDisappear
。
广播通知
NSNotificationCenter.defaultCenter().postNotificationName("erro400", object: nil)
接收
override func viewWillAppear(animated: Bool) { NSNotificationCenter.defaultCenter().addObserver(self, selector: "ErroOccure", name: "erro400", object: nil) } func ErroOccure() { //present alert from here // do whatever you want }
完成后,您必须删除通知。
override func viewWillDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self) }