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

自定义UIViewController的isEditing属性观察者失效问题咨询

问题:自定义UIViewController中isEditing属性的观察者无法正常工作?

我尝试在自定义UIViewController中实现属性观察者,但发现isEditing属性的观察者无法正常工作,请问各位是否知晓原因?代码示例如下:

class MasterViewController: UIViewController {
    // MARK: - Properties
    override var isEditing: Bool {
        didSet {
            print("VC is editing")
        }
    }
}

回答

嘿,这个问题我之前也碰到过!原因其实和UIViewController管理isEditing状态的方式有关——系统并不是直接通过给isEditing属性赋值来切换状态的,而是调用setEditing(_:animated:)方法。

你重写的isEditing的didSet只会在直接给这个属性赋值时触发(比如你手动写self.isEditing = true),但系统自带的编辑触发逻辑(比如导航栏的编辑按钮点击)都是通过调用setEditing方法来更新状态的,这时候你的didSet就不会被执行到。

解决方法很简单,直接重写setEditing(_:animated:)方法就行,记得一定要调用super的实现,不然系统的编辑状态不会正确更新:

class MasterViewController: UIViewController {
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        print("VC is editing: \(editing)")
        // 这里添加你需要在编辑状态变化时执行的逻辑
    }
}

如果确实想用属性观察者的方式,也可以自己封装一个自定义属性,然后在setEditing里同步它:

class MasterViewController: UIViewController {
    private var customIsEditing: Bool = false {
        didSet {
            print("VC is editing: \(customIsEditing)")
        }
    }
    
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        customIsEditing = editing
    }
}

不过第一种方法是更符合UIKit设计规范的做法,推荐用这个~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:08