在开发过程中,难免会使用到自定义控件,自定义 cell,或在MVC 的 View 层中使用到 view所在的控制器。
比如说: 在自定义的 view类中 点击某个按钮,跳转到下一个界面,如果我们能在view类中直接获取控制器,也就进一步让 控制器与视图View解耦合了
这里可以通过响应者链的方式获取到当前 view 所在的控制器
extension UIView {
//获取view所在的 视图控制器
var viewController: UIViewController? {
get {
var nextResponder = next
while (nextResponder != nil){
if nextResponder is UIViewController {
return nextResponder as! UIViewController?
}
nextResponder = nextResponder?.next
}
return nil
}
}
//获取view所在的 导航控制器
var navController: UINavigationController? {
get {
var nextResponder = next
while (nextResponder != nil){
if nextResponder is UIViewController {
return nextResponder as! UINavigationController?
}
nextResponder = nextResponder?.next
}
return nil
}
}
//获取view所在的 标签控制器
var tabBarController: UITabBarController? {
get {
var nextResponder = next
while (nextResponder != nil){
if nextResponder is UIViewController {
return nextResponder as! UITabBarController?
}
nextResponder = nextResponder?.next
}
return nil
}
}
}
将分类导入项目后,任何一个一个view 在任何地方都能随意获取到它所在的控制器,是不是很简单!
如有问题,欢迎评论交流!