解除视图控制器动画:完成:在 iOS 8 上
Posted
技术标签:
【中文标题】解除视图控制器动画:完成:在 iOS 8 上【英文标题】:dismissViewControllerAnimated:completion: on 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
),那么它当然不会显示但会记录一条错误消息:“警告:尝试呈现不在窗口层次结构中的视图!"
-
这是 iOS 8 中的错误还是只是新方法?
如何找到可以在其上显示
UIALertController
的视图控制器?
【问题讨论】:
isBeingDismissed
有点帮助
【参考方案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()
【讨论】:
以上是关于解除视图控制器动画:完成:在 iOS 8 上的主要内容,如果未能解决你的问题,请参考以下文章
带有dismissViewControllerAnimated的iOS 8错误:完成:动画?
在模态视图控制器的解除动画时访问presentingViewController