UITableViewController设置isEditing后属性值未变,是否因重写setEditing导致?
问题解答
这不是预期行为,是你重写setEditing(_:animated:)方法时的操作遗漏导致的。
UITableViewController的isEditing属性和setEditing(_:animated:)方法是绑定的:当你直接设置isEditing的值时,系统会自动触发setEditing(_:animated:)方法。默认情况下,父类的setEditing实现会同时完成两件事:
- 更新自身的
isEditing属性值 - 同步设置
tableView.isEditing的状态
但你重写后的方法只处理了tableView.isEditing = editing,没有调用父类的实现,导致UITableViewController自身的isEditing属性从未被更新,所以你打印出来的结果始终不对。
修正后的代码只需要在重写的方法里加上父类调用即可:
@IBAction func setEditMode(_ sender: UIButton) { if isEditing { sender.setTitle("Edit", for: .normal) isEditing = false print(isEditing) // 现在会输出false } else { sender.setTitle("Done", for: .normal) isEditing = true print(isEditing) // 现在会输出true } } override func setEditing(_ editing: Bool, animated: Bool) { // 先调用父类实现,更新自身isEditing属性 super.setEditing(editing, animated: animated) // 再设置tableView的编辑状态(其实父类默认也会处理这个,不需要额外逻辑的话可只保留super调用) tableView.isEditing = editing }
补充说明:如果你的需求只是同步tableView的编辑状态,完全不需要重写setEditing方法——UITableViewController的默认实现已经帮你做好了自身isEditing属性和tableView状态的同步。只有当你需要在进入/退出编辑模式时添加额外动画或自定义逻辑时,才需要重写该方法,且必须记得调用父类的实现。
内容的提问来源于stack exchange,提问作者fensiz
相关产品推荐
相关产品推荐

