自定义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
相关产品推荐
相关产品推荐

