iOS 获取当前正在显示的ViewController
2016-02-26 11:49
591 查看
iOS 获取当前正在显示的ViewController,方法有如下几种:
1:从UIWindow中获取
2:从UIView里面获取
1:从UIWindow中获取
#import "UIWindow+SHHelper.h" @implementation UIWindow (SHHelper) - (UIViewController*)sh_topMostController { // getting rootViewController UIViewController *topController = [self rootViewController]; // Getting topMost ViewController while ([topController presentedViewController]) topController = [topController presentedViewController]; // Returning topMost ViewController return topController; } - (UIViewController*)sh_currentViewController; { UIViewController *currentViewController = [self sh_topMostController]; while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController]) currentViewController = [(UINavigationController*)currentViewController topViewController]; return currentViewController; } @end
2:从UIView里面获取
//满足一个日常的需求:在UITableviewcell里面的UIView模块里面,调用self.navigationcontroller pushviewcontroller推入一个新的viewcontroller,需要获取其上层的UIViewcontroller, 可以使用下面的方法: - (UIViewController *)sh_viewController { UIResponder *responder = self; while ((responder = [responder nextResponder])){ if ([responder isKindOfClass: [UIViewController class]]){ return (UIViewController *)responder; } } return nil; }3:从UIViewController中获取
#import "UIViewController+SHHelper.h" @implementation UIViewController (SHHelper) - (UIViewController*)sh_topMostController { UIViewController *topController = self ; while ([self presentedViewController]) topController = [topController presentedViewController]; return topController; } - (UIViewController*)sh_currentViewController; { UIViewController *currentViewController = [self sh_topMostController]; while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController]) currentViewController = [(UINavigationController*)currentViewController topViewController]; return currentViewController; } //我们在非视图类中想要随时展示一个view时,需要将被展示的view加到当前view的子视图,或用当前view presentViewController,或pushViewContrller,这些操作都需要获取当前正在显示的ViewController。 //获取当前view的UIViewController + (UIViewController *)sh_currentViewControllerFromcurrentView{ UIViewController *result = nil; // 1. get current window UIWindow * window = [[UIApplication sharedApplication] keyWindow]; if (window.windowLevel != UIWindowLevelNormal) { NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow * tempWindow in windows) { if (tempWindow.windowLevel == UIWindowLevelNormal) { window = tempWindow; break; } } } // 2. get current View Controller UIView *frontView = [[window subviews] objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { result = nextResponder; } else { result = window.rootViewController; } return result; } //获取当前屏幕中present出来的viewcontroller。 - (UIViewController *)getPresentedViewController { UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *topVC = appRootVC; if (topVC.presentedViewController) { topVC = topVC.presentedViewController; } return topVC; } @end
相关文章推荐
- iOS 9 学习系列: MapKit
- IOS--纯代码方式编写View
- iOS程序破解与调试基础
- iOS 设计模式 - 原型模式
- Local declaration of 'XYZ' hides instance variable
- iOS 常用的XML解析类库
- iOS开发--- NSString 字符串处理:截取字符串、匹配字符串、分隔字符串
- [ios]关于 原生二维码扫描captureSession startRunning stopRunning 无法停止开始 扫描的问题
- ios 界面间跳转方法总结
- iOS字符串的截取、匹配、分割
- iOS怎样将 URL转换成String
- Xcode7--免证书真机调试
- Mob第一章-分享
- iOS项目本地git添加和删除
- iOS应用内付费(IAP)开发步骤列表
- iOS自定义字体
- iOS中KVO模式的解析与应用
- iOS数据持久化-归档NSKeyedArchiver
- iOS 设计模式 - 策略模式
- ios开发笔记(4)