如何通过扩展从继承自UIView的类中获取ViewController?
获取自定义UIView对应的ViewController
嘿,这两个扩展都能帮你轻松拿到自定义View所属的ViewController,具体用法分两种情况来看:
用扩展1(UIResponder扩展)
因为UIView本身就继承自UIResponder,所以你的自定义View类可以直接调用parentViewController这个计算属性:
class CustomView: UIView { func accessParentVC() { // 直接通过self获取父ViewController guard let parentVC = self.parentViewController else { print("没找到对应的ViewController") return } // 拿到VC后做你需要的操作 print("找到的ViewController: \(parentVC)") } }
这个扩展用递归的方式,沿着响应链的next属性往上查找,直到找到第一个UIViewController类型的响应者。
用扩展2(UIView扩展)
这个是直接给UIView添加的扩展,用法更直接,调用getParentViewController即可:
class CustomView: UIView { func getAssociatedVC() { guard let parentVC = self.getParentViewController else { print("没找到对应的ViewController") return } // 执行后续逻辑 print("找到的ViewController: \(parentVC)") } }
它的原理是通过循环遍历响应链:从当前View开始,不断获取next响应者,直到找到UIViewController或者遍历完整个响应链。
两者的小区别
- 实现方式:扩展1用递归,扩展2用循环,核心都是沿着响应链查找目标
- 适用范围:扩展1的优势是所有
UIResponder子类(比如UIButton、UILabel)都能复用这个属性,不止UIView可用 - 效率差异:极端情况下(响应链极长)循环方式可能比递归略高效,但日常开发中两者差异可以忽略不计
内容的提问来源于stack exchange,提问作者Benjamin RD
相关产品推荐
相关产品推荐

