在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中我们不能依赖属性presentedViewController
来找出哪个viewcontroller当前是顶级可见的viewcontroller。
在iOS 8中,警报需要呈现在viewcontroller(poses another problem)上。如果我们尝试呈现的viewcontroller已经呈现了一个viewcontroller,它们将不显示。
如果我刚解除我提出的viewcontroller并在当前顶部可见的viewcontroller上显示UIAlertController
(通过递归搜索最后的presentedViewController
),那么它当然不会显示但是会记录一条错误消息:"警告:尝试在窗口层次结构中显示其视图!"
UIALertController
上展示的viewcontroller?答案 0 :(得分:1)
我找到了一个解决方法,找出哪个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];
斯威夫特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()
}
}