You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过扩展从继承自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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:33:23