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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:55:32