中国领先的工业平台

返回贤集网 返回微头条
贤集网技术微头条APP获取

iOS学习——获取当前最顶层的ViewController

 山东大明消毒科技有限公司

下载贤集网APP入驻自媒体

 在ios开发过程中,我们经常性会需要获取当前页面的ViewController,然后利用ViewController进行一些操作,例如在最顶层的ViewController上展示一个UIAlertController,或者在最顶层的ViewController上present另一个ViewController,或者进行其他操作。1 实现思路  通过最底层的ViewController依次向上寻找,直到找到最顶层的ViewController,也就是从UIApplication的keyWindow的rootViewController开始寻找(如果有多个UIWindow则要考虑UIWindow的选择问题。

  在寻找的过程中,要分别考虑当前ViewController是UITabBarController和UINavigationController的情况,同时还要考虑到当前ViewController是否通过 presentViewController:animated:completion: 模态展示了其他ViewController。2 实现方法 方法一:- (UIViewController *)topViewController {UIViewController *resultVC;resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];while (resultVC.presentedViewController) {resultVC = [self _topViewController:resultVC.presentedViewController];}return resultVC;}- (UIViewController *)_topViewController:(UIViewController *)vc {if ([vc isKindOfClass:[UINavigationController class]]) {return [self _topViewController:[(UINavigationController *)vc topViewController]];} else if ([vc isKindOfClass:[UITabBarController class]]) {return [self _topViewController:[(UITabBarController *)vc selectedViewController]];} else {return vc;}return nil;}复制代码使用方法:UIViewController *topmostVC = [self topViewController];复制代码方法二://获取当前屏幕显示的viewcontroller- (UIViewController *)getCurrentVC{UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];return currentVC;}- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC{UIViewController *currentVC;if ([rootVC presentedViewController]) {// 视图是被presented出来的rootVC = [rootVC presentedViewController];}if ([rootVC isKindOfClass:[UITabBarController class]]) {// 根视图为UITabBarControllercurrentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];} else if ([rootVC isKindOfClass:[UINavigationController class]]){// 根视图为UINavigationControllercurrentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];} else {// 根视图为非导航类currentVC = rootVC;}return currentVC;}复制代码  解析:代码主要使用了递归的思想(哈哈哈,毕业工作半年,发觉第一次写iOS用到递归,突然觉得高大上)。

[UIApplication sharedApplication].keyWindow.rootViewController获取到的是项目的根视图,结合可能用到UITabBarController或者UINavigationController作为导航结构,以及可能present出新的VC,其实如果用storyboard的方式写UI的话就很清晰,类似树的结构,再利用递归找到当前视图。   ps:     如果是需要push新的视图,就非常简单了。用上面的方法获取到顶层的视图,判断currentVC.navigationController是否为nil。(为nil,则新建UINavigationController,然后再push;否则直接用currentVC.navigationController去push)。 三 扩展  如果用到的场景主要是vc里,可以弄成类别如下:#import "UIViewController+Helper.h"@property (nonatomic, strong ,readonly) UIViewController * _Nullable currentVC;//当前屏幕显示的viewcontroller-(UIViewController *)currentVC{UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;UIViewController *controller = [self getCurrentVCFrom:rootViewController];return controller;}//getCurrentVCFrom参考上文两种方法复制代码

最新回复

还没有人回复哦,抢沙发吧~

发布回复

为您推荐

热门交流