当前位置: > > > Swift - 通过UIView对象找到其所在的UIViewController

Swift - 通过UIView对象找到其所在的UIViewController

有时我们需要通过 UIView 对象获取该对象所属的 UIViewController。比如我们在自定义单元格(tableViewCell)中需要对导航控制器(navigationController)进行一些操作,就需要先获取到其所在的 UIViewController

1,实现原理

我们可以通过消息响应者链找到 UIView 所在的 UIViewController

  • UIView 类继承于 UIResponder,通过 UIRespondernext 方法来获取 UIViewController
  • 如果 next 返回是空,则继续向上遍历 superview 并再次使用 next 方法获取。这样一直找下去,直到找到或抛出异常。

2,实现代码

通过扩展 UIView,给其添加个 firstViewController 方法,从而让我们可以获得任意视图对象(View)所属视图控制器。
extension UIView {
    //返回该view所在VC
    func firstViewController() -> UIViewController? {
        for view in sequence(first: self.superview, next: { $0?.superview }) {
            if let responder = view?.next {
                if responder.isKind(of: UIViewController.self){
                    return responder as? UIViewController
                }
            }
        }
        return nil
    }
}

评论0