是否可以确定ViewController是否显示为Modal?

luk*_*war 115 iphone controller modal-dialog view ios

是否有可能在ViewController类中检查它是否显示为模态视图控制器?

Gab*_*lla 95

由于modalViewController已经在iOS 6中弃用,这里的版本适用于iOS 5+并且在没有警告的情况下编译.

Objective-C的:

- (BOOL)isModal {
    return self.presentingViewController.presentedViewController == self
      || (self.navigationController != nil && self.navigationController.presentingViewController.presentedViewController == self.navigationController)
      || [self.tabBarController.presentingViewController isKindOfClass:[UITabBarController class]];
}
Run Code Online (Sandbox Code Playgroud)

迅速:

var isModal: Bool {
    return self.presentingViewController?.presentedViewController == self
        || (self.navigationController != nil && self.navigationController?.presentingViewController?.presentedViewController == self.navigationController)
        || self.tabBarController?.presentingViewController is UITabBarController
}
Run Code Online (Sandbox Code Playgroud)

帽子提示菲利普的回答.

  • 如果父视图控制器是推送视图控制器的模式,则不起作用. (10认同)
  • 很好的捕获,我不得不在很长一段时间后再次使用它,并注意到发生了弃用...我编辑了我的答案,以便人们在使用iOS 6+时开始在这里查找正确的代码,谢谢 (2认同)
  • 有一个错误,我们应该检查双方是否都是零,因为`nil == nil`返回'YES`,这不是我们想要的结果. (2认同)

Fel*_*ino 77

如果您正在寻找iOS 6+,这个答案已被弃用,您应该查看Gabriele Petronella的答案


作为UIKit原生的属性或方法,没有简洁的方法可以做到这一点.您可以做的是检查控制器的几个方面,以确保它以模态形式呈现.

因此,为了检查当前(self在下面的代码中表示)控制器是否以模态方式呈现,我将函数显示在UIViewController类别中,或者(如果您的项目不需要使用其他UIKit控制器,如UITableViewController例如)在我的其他控制器继承的基本控制器中

-(BOOL)isModal {

     BOOL isModal = ((self.parentViewController && self.parentViewController.modalViewController == self) || 
            //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
            ( self.navigationController && self.navigationController.parentViewController && self.navigationController.parentViewController.modalViewController == self.navigationController) || 
            //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
            [[[self tabBarController] parentViewController] isKindOfClass:[UITabBarController class]]);

    //iOS 5+
    if (!isModal && [self respondsToSelector:@selector(presentingViewController)]) {

        isModal = ((self.presentingViewController && self.presentingViewController.modalViewController == self) || 
             //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
             (self.navigationController && self.navigationController.presentingViewController && self.navigationController.presentingViewController.modalViewController == self.navigationController) || 
             //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
             [[[self tabBarController] presentingViewController] isKindOfClass:[UITabBarController class]]);

    }

    return isModal;        

}
Run Code Online (Sandbox Code Playgroud)

编辑:我添加了最后一项检查,以查看是否正在使用UITabBarController,并将另一个UITabBarController呈现为模态.

编辑2:添加iOS 5+检查,UIViewController不再回答parentViewController,而是回答presentingViewController.

编辑3:我为它创建了一个要点以防万一https://gist.github.com/3174081


Raj*_*Raj 35

在iOS5 +中,正如您在UIViewController类参考中所看到的,您可以从属性"presentsViewController"获取它.

presentsViewController呈现此视图控制器的视图控制器.(只读)

@property(非原子,只读)UIViewController*presentsViewController
讨论

如果接收此消息的视图控制器由另一个视图控制器呈现,则此属性保存呈现它的视图控制器.如果未显示视图控制器,但正在显示其中一个祖先,则此属性使视图控制器保持显示最近的祖先.如果视图控制器或其任何祖先都没有出现,则此属性为零.

可用性适用
于iOS 5.0及更高版本.

UIViewController.h中声明

  • 工作完美,使用if(self.presentingViewController){//这是一个模态viewContoller} else {//这是一个普通的ViewController} (3认同)
  • 恕我直言,这是*唯一正确答案.只需检查是否存在`presentsViewController`.它也可以在容器视图控制器中工作,因为它会自动遍历祖先. (2认同)

hpi*_*que 17

如果没有,您可以presentedAsModal在UIViewController子类中为this()定义一个属性,并YES在将ViewController作为模态视图呈现之前将其设置为.

childVC.presentedAsModal = YES;
[parentVC presentModalViewController:childVC animated:YES];
Run Code Online (Sandbox Code Playgroud)

您可以在viewWillAppear覆盖中检查此值.

我相信没有一个官方财产说明了如何呈现视图,但没有什么能阻止你创建自己的视图.


小智 8

如果self.navigationController是模态呈现但是self不等于self.navigationController.viewControllers [0],那么Petronella的答案不起作用,在这种情况下,self被推送.

以下是解决问题的方法.

return self.presentingViewController.presentedViewController == self
            || (self.navigationController != nil && self.navigationController.presentingViewController.presentedViewController == self.navigationController && self == self.navigationController.viewControllers[0])
            || [self.tabBarController.presentingViewController isKindOfClass:[UITabBarController class]];
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

return self.presentingViewController?.presentedViewController == self
        || (self.navigationController != nil && self.navigationController?.presentingViewController?.presentedViewController == self.navigationController && self.navigationController?.viewControllers[0] == self)
        || self.tabBarController?.presentingViewController is UITabBarController
Run Code Online (Sandbox Code Playgroud)


kub*_*ubi 6

这应该工作.

if(self.parentViewController.modalViewController == self)…
Run Code Online (Sandbox Code Playgroud)

  • 问题可能是您的UIViewController子类位于UINavigationController或UITabBarController(或两者)中,在这种情况下,您可能需要在视图层次结构中挖掘更多内容以找出作为模态视图控制器呈现的父级. (4认同)

Sun*_*hah 5

最好的检查方式

 if (self.navigationController.presentingViewController) {
         NSLog(@"Model Present");
    }
Run Code Online (Sandbox Code Playgroud)