如何在 UITableView 处于编辑模式时隐藏条形按钮项目? (Swift)

How to hide Bar Button Items when UITableView is in edit mode? (Swift)

标题基本上说明了一切。

我有一个 UITableView,我希望 RightBarButtonItem 项在 UITableView 处于编辑模式时消失。不幸的是,到目前为止我找到的所有答案都建议将按钮设置为零......这对我不起作用,因为我不想摆脱按钮和对它的引用,只是在UITableView 处于编辑模式。

我不知道该怎么做,然后是:

  1. 检测UITableView何时进入编辑模式
  2. 隐藏 RightBarButtonItem(不完全删除)
  3. 检测 UITableView 何时离开编辑模式(以便按钮可以重新出现)

任何帮助将不胜感激,谢谢!

您可以使用可选的数据源方法来检测行何时被编辑,tableView(_:canEditRowAtIndexPath:)

在该方法中,您可以隐藏或禁用栏按钮项(就 UI 和代码而言,禁用可能是更友好的做法)。条形按钮上没有 hidden 属性,因此要正确隐藏它意味着 you potentially do some grody coding 暂时删除或使其消失。

无论如何,我建议如下:

func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool {
    self.navigationItem.rightBarButtonItem.enabled = false
    return true
}

我对任何需要它的人的工作解决方案:

override func setEditing(editing: Bool, animated: Bool) {
    if (editing) {
        super.setEditing(true, animated: true)
        self.navigationItem.rightBarButtonItem!.enabled = false
    } else {
        super.setEditing(false, animated: true)
        self.navigationItem.rightBarButtonItem!.enabled = true
    }
}

确保在编辑开始之前和之后设置 super.setEditing 以保留编辑按钮的功能。

此外,如果您不希望 UITableView 在用户离开 UITableView 且未先单击 "done" 时保持编辑模式,请添加以下内容功能:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(true)
    if (editing) {
        editing = false
    }
}

我遇到了同样的挑战,我需要在某些情况下隐藏和显示两个不同的条形按钮。第一个是 "edit" 按钮,用于在我的视图中进入编辑模式,第二个是 "done" 按钮,用于保存更改。所以他们必须互换出现。

我对 UINavigationItem class 进行了扩展,其中实现了两种方法。一个从栏中删除项目。第二个将项目添加到栏中。作为这些方法的参数,我传递了我制作的项目的 IBOutlets,因此当项目从 bar

中移除时它们不会被释放
extension UINavigationItem {

  func deleteFromRightBar(item: UIBarButtonItem) {
    // make sure item is present 
    guard let itemIndex = self.rightBarButtonItems?.index(of: item) else {
      return
    }
    // remove item
    self.rightBarButtonItems?.remove(at: itemIndex)
  }

  func addToRightBar(item: UIBarButtonItem) {
    // make sure item is not present
    guard self.rightBarButtonItems?.index(of: item) == nil else {
      return
    }
    // add item
    self.rightBarButtonItems?.append(item)
  }
}

我就是这样使用这些方法的

navigationItem.deleteFromRightBar(item: doneButton)
navigationItem.addToRightBar(item: editButton)