点击后更改 barButtonSystemItem

Change barButtonSystemItem after tapping

我在屏幕右侧有一个条形按钮,它是barButtonSystemItem: .edit,用于将tableView置于编辑模式。我想要当用户点击它时,它会更改为 barButtonSystemItem: .done 并从编辑模式关闭 tableview。 需要明确的是,每次单击 barButton 时,它的类型都应该从编辑更改为完成。

这是我的代码,但它始终处于编辑状态,不会更改为完成

fileprivate func addBarButton() {
    if tableView.isEditing {
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(editButtonAction))
    } else {
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(doneButtonAction))
    }
}


@objc func editButtonAction(sender: UIBarButtonItem) {
    tableView.isEditing = !tableView.isEditing
}



@objc func doneButtonAction(sender: UIBarButtonItem) {
    tableView.isEditing = !tableView.isEditing
}

override func viewDidLoad() {
    super.viewDidLoad()
    addBarButton()
    tableView?.isEditing = true
}

在方法 editButtonActioneditButtonAction 的主体中,您只需通过执行 tableView.isEditing = !tableView.isEditing 来更改 tableView 编辑状态。此操作对 navigationItem 没有任何影响。

我建议您通过将 addBarButton 重命名为 updateBarButton 来稍微重构代码,并在每次 table 编辑状态更改时调用它,另外从 [=19] =] 就像你现在做的那样。所以你的代码会变成这样:

  fileprivate func updateBarButton() {
    if tableView.isEditing {
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(editButtonAction))
    } else {
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(doneButtonAction))
    }
}


@objc func editButtonAction(sender: UIBarButtonItem) {
    tableView.isEditing = !tableView.isEditing
    updateBarButton() // Note the additional call of the update method
}

@objc func doneButtonAction(sender: UIBarButtonItem) {
    tableView.isEditing = !tableView.isEditing
    updateBarButton() // Note the additional call of the update method
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView?.isEditing = true
    updateBarButton() // Note that we call this method after changing the table view state so that it will have the most recent value
}