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

如何在TheView类中获取MyViewController的flag值?已尝试parentViewController未果

获取ViewController属性的正确方式

嘿,你之前用parentViewController没成功是有原因的——这个属性是给**子视图控制器(child view controller)**用的,而你的TheView是UIView的子类,属于视图层级(view hierarchy),不是视图控制器层级(view controller hierarchy),所以它的parentViewController自然是nil啦。

要从TheView内部获取所属MyViewController的flag属性,最可靠的方式是沿着**响应者链(Responder Chain)**向上查找对应的ViewController,具体可以这么做:

1. 给UIView添加扩展,实现查找ViewController的方法

先写一个通用的UIView扩展,帮你遍历响应者链找到对应的ViewController:

extension UIView {
    func owningViewController() -> UIViewController? {
        var responder: UIResponder? = self
        while responder != nil {
            responder = responder?.nextResponder
            if let viewController = responder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

2. 在TheView中使用这个方法获取flag

现在在你的TheView类里,就可以调用这个方法拿到MyViewController的实例,进而获取flag了:

class TheView: UIView {
    func doSomething() {
        if let myVC = self.owningViewController() as? MyViewController {
            let currentFlag = myVC.flag
            print("当前flag的值是:\(currentFlag)")
            // 在这里使用flag做你需要的操作
        }
    }
}

小提醒

虽然这种方法能解决你的问题,但其实它让TheView和MyViewController产生了强耦合——如果以后你把TheView用到其他ViewController里,这段代码就会出问题。更优雅的做法是通过代理(Delegate)、**闭包(Closure)或者通知(Notification)**来传递flag的值,这样View和ViewController之间的依赖会更松散,代码也更易维护。不过如果你的场景就是固定让TheView只属于MyViewController,那上面的方法完全没问题~

内容的提问来源于stack exchange,提问作者mcgtrt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:33