在iOS 8上使用dismissViewControllerAnimated:completion:方法

3
在 iOS <= 7 中,直接调用 dismissViewControllerAnimated:completion: 后,presentedViewController 会变成 nil。 在 iOS 8 中,presentedViewController 仍然指向被呈现的视图控制器,直到执行完成块。
[self dismissViewControllerAnimated:NO completion:^{
    //self.presentedViewController is nil
}];
//self.presentedViewController is nil on iOS 7, but not nil on iOS 8

在iOS 8中,我们不能依赖属性来确定当前顶部可见的视图控制器。在iOS 8中,警报需要呈现到一个视图控制器上(这 pose another problem)。如果我们尝试在已经呈现了视图控制器的视图控制器上呈现它们,那么它们就不会显示出来。
如果我刚刚解除了我的呈现的视图控制器,并在当前顶部可见的视图控制器上显示了一个UIAlertController(通过递归搜索最后一个),那么它当然不会显示,但会记录一个错误消息:"Warning: Attempt to present on whose view is not in the window hierarchy!"
问题:
  1. 这是iOS 8的一个bug还是新的方式?
  2. 如何找到可以呈现UIALertController的视图控制器?

isBeingDismissed 有一定帮助。 - fabb
1个回答

1

我找到了一个解决方法,可以找出我可以在哪个视图控制器上呈现警报:

@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];

Swift 3:

import UIKit

extension UIViewController {
    func visibleViewController() -> UIViewController? {
        guard !(self is UINavigationController) else {
            let navVC = self as! UINavigationController
            return navVC.topViewController?.visibleViewController()
        }

        guard !(self is UITabBarController) else {
            let tabVC = self as! UITabBarController
            return tabVC.selectedViewController?.visibleViewController()
        }

        if self.presentedViewController == nil || 
           self.presentedViewController!.isBeingDismissed {
            return self
        }

        return self.presentedViewController?.visibleViewController()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接