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)
帽子提示菲利普的回答.
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中声明
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)
这应该工作.
if(self.parentViewController.modalViewController == self)…
Run Code Online (Sandbox Code Playgroud)
最好的检查方式
if (self.navigationController.presentingViewController) {
NSLog(@"Model Present");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57453 次 |
| 最近记录: |