如何通过View获取Controller
2015-08-12 18:19
465 查看
我们知道,对于一个视图控制器类UIViewController,可以通过[self view]来获取到它所管理的视图UIView,反过来,对于一个视图类UIView,我们怎么获取到它的UIViewController? UIView继承自UIResponder,UIResponder有一个实例方法- (UIResponder *)nextResponder,该方法返回响应链(responder chain)上的下一个对象。 有关- (UIResponder *)nextResponder方法,更具体的说明可参考UIResponder Class Reference,主要有几个重点: 1)UIResponder类不会自动存储和设置它的下一个响应者(the next responder),默认情况下nextResponder方法放回nil; 2)UIResponder的子类必须重载nextResponder方法,设置下一个响应者。比如UIView类,当管理它的UIViewController对象存在时,返回该UIViewController,否则返回它的父视图(superview);UIViewController类返回它所管理的视图的父视图;UIWindow类返回应用对象(the application object);UIApplication类返回nil。 通过以上的分析,对于一个视图类UIView,我们可以利用- (UIResponder *)nextResponder方法遍历响应链,获取到它的UIViewController,具体代码:[plain] view plaincopy@implementation UIView (FindUIViewController) - (UIViewController *)viewController { /// Finds the view's view controller. // Traverse responder chain. Return first found view controller, which will be the view's view controller. UIResponder *responder = self; while ((responder = [responder nextResponder])) if ([responder isKindOfClass: [UIViewController class]]) return (UIViewController *)responder; // If the view controller isn't found, return nil. return nil; } @end
- (UIViewController *)viewController {for (UIView* next = [self superview]; next; next = next.superview) {UIResponder *nextResponder = [next nextResponder];if ([nextResponder isKindOfClass:[UIViewController class]]) {return (UIViewController *)nextResponder;}}return nil;}
相关文章推荐
- android中Http和HttpClient的Get和Post方法的使用
- 求特定几何变换
- CSS里面逗号和分号的区别
- Xtradb+Haproxy高可用数据库集群(三)sysbench性能测试篇
- Xtradb+Haproxy高可用数据库集群(三)sysbench性能测试篇
- oracle中使用impdp数据泵导入数据提示“ORA-31684:对象类型已经存在”错误的解决
- unix时间戳(unix timestamp)与北京时间的互转方法
- 自定义UITableViewCell(1)
- python 访问hbase数据库代码,乱写
- js实现自定义滚动条
- 公司业绩关键地点
- 创建mysql用户以及权限设置
- 单例模式
- Qt Link error之找不到构造函数
- android 远程服务设计要点
- sysbench测试工具
- Windows下部署Appium教程(Android App自动化测试框架搭建)
- http异步大量图片下载,并用GridView显示九宫格图片样式
- hdu2046 骨牌铺方格 (斐波那契数
- view的setvisibility(8)