2011-03-17 78 views
49

有没有方法检查模态视图是否存在?我只想在模态视图存在的情况下运行一个方法。另外,如果我有多个模态视图,是否有方法检查某个模态视图是否存在。iOS - 如何检查模态视图是否存在

我使用下面的代码来呈现和解雇模态的观点:

[self presentModalViewController:myModalView animated:YES]; 
    [self dismissModalViewControllerAnimated:YES]; 

预先感谢您!

干杯, 埃文

PS。我的模态视图有一个视图控制器,但我想检查模态视图是否存在于异步运行的单独类中。

+7

请考虑改变正确答案为这个问题检查的模式view controller存在。 – Daniel 2012-02-24 15:31:05

回答

71

您是否正在检查父视图控制器中是否存在模态视图控制器?如果是这样,你可以检查视图控制器的modalViewController属性:

BOOL modalPresent = (self.modalViewController); 

如果您想检查特定模式视图控制器,你可以得到的模态视图控制器的类名像这样:

NSString *modalClassName = NSStringFromClass([self.modalViewController class]); 
+54

self.modalViewController现在已被弃用,您现在应该使用BOOL modalPresent =(BOOL)(self.presentedViewController); – allaire 2012-04-26 19:33:02

+2

要搭载@ allaire的评论,以下是有关presentsViewController的文档(http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/presentedViewController),似乎表明一个模式视图控制器只存在于“this”视图中。 – Danny 2013-05-29 23:46:07

53

您可以检查使用:self.presentedViewController,返回The view controller that is presented by this view controller, or one of its ancestors in the view controller hierarchy.

+4

这应该是检查的答案。 'modalViewController'已弃用 – nburk 2014-12-02 09:40:25

+1

现在使用'presentedViewController'。 – WMios 2016-02-09 07:54:44

5

什么工作对我来说是以下几点:

// this is the trick: set parent view controller as application's window root view controller 
UIApplication.sharedApplication.delegate.window.rootViewController = viewController; 

// assert no modal view is presented 
XCTAssertNil(viewController.presentedViewController); 

// simulate button tap which shows modal view controller 
[viewController.deleteButton sendActionsForControlEvents:UIControlEventTouchUpInside]; 

// assert that modal view controller is presented 
XCTAssertEqualObjects(viewController.presentedViewController.class, MyModalViewController.class); 

据我测试,这适用于iOS7和iOS8。但是没有尝试iOS6。

+0

如果您的UIViewController嵌入到其中,请不要忘记添加UINavigationController作为窗口的rootViewController。然后,只需在navController上调用presentViewController。 :) – 2017-05-18 17:28:19

0

您可以从父view controller

if ([[self presentingViewController] presentingViewController]) { 

}