dismissViewControllerAnimated:完成:在iOS 8上

在iOS <= 7中,直接调用dismissViewControllerAnimated:completion:会导致presentedViewController dismissViewControllerAnimated:completion: nil 。 在iOS 8中, presentedViewController的ViewController仍然指向呈现的视图控制器,直到完成块被执行。

 [self dismissViewControllerAnimated:NO completion:^{ //self.presentedViewController is nil }]; //self.presentedViewController is nil on iOS 7, but not nil on iOS 8 

因此,在iOS 8中,我们不能依赖于presentedViewController ViewController属性来找出哪个viewcontroller是当前顶级的可见视图控制器。

在iOS 8中,警报需要呈现给视图控制器(这引起了另一个问题 )。 他们不会显示我们试图呈现的视图控制器是否已经呈现视图控制器。

如果我刚刚解雇了我提交的UIAlertController并在当前顶部可见的UIAlertController (通过recursionsearch最后UIAlertController显示UIAlertController ,那么它当然不会显示,但会logging一条错误消息:“警告:尝试呈现其视图不在窗口层次结构中!“

  1. 这是在iOS 8中的错误还是只是新的方式?
  2. 我怎样才能find我可以提出我的UIALertController的viewcontroller?

我find了一个解决方法来找出哪些viewcontroller我可以提出警报:

 @implementation UIViewController (visibleViewController) - (UIViewController *)my_visibleViewController { if ([self isKindOfClass:[UINavigationController class]]) { // do not use method visibleViewController as the presentedViewController could beingDismissed return [[(UINavigationController *)self topViewController] my_visibleViewController]; } if ([self isKindOfClass:[UITabBarController class]]) { return [[(UITabBarController *)self selectedViewController] my_visibleViewController]; } if (self.presentedViewController == nil || self.presentedViewController.isBeingDismissed) { return self; } return [self.presentedViewController my_visibleViewController]; } @end // To show a UIAlertController, present on the following viewcontroller: UIViewController *visibleViewController = [[UIApplication sharedApplication].delegate.window.rootViewController my_visibleViewController];