【问题标题】:dismissViewControllerAnimated:completion: on iOS 8解除视图控制器动画:完成:在 iOS 8 上
【发布时间】:2014-11-13 11:04:18
【问题描述】:

在 iOS 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 中,我们不能依赖属性 presentedViewController 来找出当前最顶层的可见视图控制器。

在 iOS 8 中,警报需要呈现在视图控制器(poses another problem)上。如果我们尝试呈现的视图控制器已经呈现视图控制器,它们将不会显示。

如果我刚刚关闭了呈现的视图控制器并在当前顶部可见的视图控制器上显示UIAlertController(通过递归搜索最后一个presentedViewController),那么它当然不会显示但会记录一条错误消息:“警告:尝试呈现不在窗口层次结构中的视图!"

  1. 这是 iOS 8 中的错误还是只是新方法?
  2. 如何找到可以在其上显示 UIALertController 的视图控制器?

【问题讨论】:

  • isBeingDismissed 有点帮助

标签: ios uiviewcontroller ios8 presentviewcontroller


【解决方案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];

斯威夫特 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()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多