在调用dismissModalViewControllerAnimated
之前,有没有办法判断是否已经提供了模态UIViewController?
答案 0 :(得分:17)
这个问题的答案太多了,没有一个涵盖所有案例。此外,尽管你在documentation找到了什么,但还有两个选择现已弃用的modalViewController
:
如果你需要知道你是否是模态的:
BOOL modal = nil != [self presentingViewController];
如果您需要通过模式知道涵盖:
BOOL hiddenByModal = nil != [self presentedViewController];
答案 1 :(得分:9)
iOS6 + - 使用presentViewController: 从iOS 6开始,
presentedViewController
应该被用作已弃用的modalViewController
使用属性:
不推荐使用 - modalViewController: 用于活动模态视图的控制器 - 即临时显示在由接收器管理的视图顶部的视图。 (只读)
@property(nonatomic, readonly) UIViewController *modalViewController
答案 2 :(得分:2)
我通常会添加一个名为isModal
的BOOL变量,并在初始化一个viewcontroller之后但在调用presentModalViewController
之前设置它。类似的东西:
MyViewController *controller = [[MyViewController alloc] init];
controller.isModal = YES;
[self presentModalViewController:controller animated:YES];
然后,在MyViewController中,在需要解雇之前,我只需检查:
if (isModal) { //dismiss modal }
答案 3 :(得分:2)
在iOS 5之后你应该使用:
if (self.presentingViewController != nil) {
[self dismissViewControllerAnimated:YES completion:^{
//has dismissViewControllerAnimated
}];
}
编辑更改iOS版
答案 4 :(得分:1)
我知道这已经有一段时间了,但只是想在这件事上加上我的2美分。
当应用程序转到后台时,我需要确定是否存在模态呈现的ViewController,以便首先将其解除。
首先,我对UIWindow
进行了扩展,以便返回当前的ViewController
:
extension UIWindow {
func getCurrentViewController() -> UIViewController? {
guard let rvc = self.rootViewController else {
return nil
}
if let pvc = rvc.presentedViewController {
return pvc
} else if let svc = rvc as? UISplitViewController, svc.viewControllers.count > 0 {
return svc.viewControllers.last!
} else if let nc = rvc as? UINavigationController, nc.viewControllers.count > 0 {
return nc.topViewController!
} else if let tbc = rvc as? UITabBarController {
if let svc = tbc.selectedViewController {
return svc
}
}
return rvc
}
}
然后我进入appDelegate
并在applicationDidEnterBackground()
上添加了测试:
func applicationDidEnterBackground(_ application: UIApplication) {
if let vc = self.window?.getCurrentViewController() {
if vc.presentingViewController != nil {
vc.dismiss(animated: false, completion: nil)
}
}
}
此解决方案位于 Swift 3