获取 uiview 的 uiviewcontroller

在自己封装控件时,有时需要获取该控件(UIView)所在的视图控制器(UIViewController),可以使用以下方式获得。

通过为 UIView 添加分类实现:

1
2
3
4
5
6
7
8
9
10
11
12
- (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;
}

🎁彩蛋

1
2
3
4
5
6
7
8
/// 返回所在的导航控制器
- (UINavigationController *)navigationController {
UIResponder *responder = self;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: [UINavigationController class]])
return (UINavigationController *)responder;
return nil;
}