手把手教你在当前View上获取父控制器

前言

  • 写项目时遇到一个问题,在tableview上的cell上一个button的点击事件是页面的跳转,可由于MVC中UITableViewDataSource实现在View层,因此只能想办法在View上获取其父控制器

参考文章

  • iOS开发在子视图中获取父控制器、父视图
  • UIResponder究竟是个什么东西

代码详解

通过当前视图获取父视图的控制器
- (UIViewController *)LCZGetSuperViewController:(UIView *)view
{
    for (UIView* next = [view superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[HomePageViewController class]]) {
            return (HomePageViewController *)nextResponder;
        }
    }
    return nil;
}
  • 核心代码是调用了(UIResponder *)nextResponder方法,UIResponder类并不自动保存或设置下一个响应者,该方法的默认实现是返回nil。子类的实现必须重写这个方法来设置下一响应者。UIView的实现是返回管理它的UIViewController对象(如果它有)或者其父视图。而UIViewController的实现是返回它的视图的父视图;UIWindow的实现是返回app对象;而UIApplication的实现是返回nil。所以,响应链是在构建视图层次结构时生成的。通过它返回UIViewController

你可能感兴趣的:(Objective-C)