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

如何解决UIBarButtonItem配合setEditing使用时的访问与生效问题

UIBarButtonItem在setEditing中控制显隐的解决方案

问题根因

  • 若直接在ViewController类作用域下初始化UIBarButtonItem常量,此时ViewController实例未完成初始化,你指定的target: self是无效的,所以按钮点击事件不会触发
  • 若在viewDidLoad内部声明UIBarButtonItem,属于局部变量,作用域仅限viewDidLoad方法内部,外部的setEditing方法无法访问

实现步骤

  1. 在类作用域下声明两个可选类型的UIBarButtonItem存储属性
var addButton: UIBarButtonItem?
var playButton: UIBarButtonItem?
  1. 在viewDidLoad中完成按钮初始化,此时self已经完全初始化,target指向有效
override func viewDidLoad() {
    super.viewDidLoad()
    addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
    playButton = UIBarButtonItem(title: "Play", style: .plain, target: self, action: #selector(playTapped))
    navigationItem.rightBarButtonItems = [addButton!, playButton!]
}
  1. 重写setEditing方法,通过修改rightBarButtonItems数组控制按钮显隐
override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)
    guard let addBtn = addButton, let playBtn = playButton else { return }
    if isEditing {
        // 编辑状态下仅保留add按钮,隐藏play按钮
        navigationItem.rightBarButtonItems = [addBtn]
    } else {
        // 非编辑状态展示两个按钮
        navigationItem.rightBarButtonItems = [addBtn, playBtn]
    }
}

注意事项

UIBarButtonItem不是UIView子类,直接修改它的isHidden属性不会生效,必须通过更新navigationItem.rightBarButtonItems数组的内容来控制按钮的显隐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:08