将表格视图设置为编辑模式

Posted

技术标签:

【中文标题】将表格视图设置为编辑模式【英文标题】:Set table view into editing mode 【发布时间】:2015-12-08 13:59:10 【问题描述】:

我在UIViewController 中有一个UITableView,并从代码而不是 IB 添加了一个编辑按钮。 UITableViewControllers 附带,但 UIVC 不附带。如何获得此按钮以将表格视图快速置于编辑模式?提前感谢您的帮助。

class WordsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate  
  override func viewDidLoad() 
    super.viewDidLoad()
    self.navigationItem.rightBarButtonItem = self.editButtonItem()
  

  func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
        return true
  

【问题讨论】:

【参考方案1】:

这是 Swift 4.2 的解决方案:

override func viewDidLoad() 
  super.viewDidLoad()

  // Use the edit button provided by the view controller.
  navigationItem.rightBarButtonItem = editButtonItem


override func setEditing(_ editing: Bool, animated: Bool) 
    // Takes care of toggling the button's title.
    super.setEditing(editing, animated: true)

    // Toggle table view editing.
    tableView.setEditing(editing, animated: true)

当按下editButtonItem 时,默认调用视图控制器的setEditing。默认情况下,按下按钮会在“编辑”和“完成”之间切换其标题,因此调用 super.setEditing 会为我们处理好这件事,我们使用 tableViewsetEditing 方法来切换编辑状态表格视图。

来源:

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621471-editbuttonitem https://developer.apple.com/documentation/uikit/uiviewcontroller/1621378-setediting https://developer.apple.com/documentation/uikit/uitableview/1614876-setediting

【讨论】:

如果这个ViewController是UITableViewController的子类,super.setEditing()会为你调用tableView.setEditing。 根据文档,这是最好的解决方案,使用 editButtonItem 而不是创建新的按钮项,并且在 setEditing(_:animated:) 方法中接收消息而不是创建新的。我只有一个担心:你为什么要反转 isEditing 的值?我认为只需“按原样”传递值就足够了(super.setEditing(editing,animated:true)) @LeoGalante tableView.isEditing 的值需要反转,因为我们正在切换它。如果它当前正在编辑,那么我们希望它停止编辑。如果它当前没有编辑,那么我们希望它开始编辑。如果我们不反转它,那么它就永远不会改变。 嗨@JaredCleghorn,我不确定,我已经尝试不使用反转并且效果很好,看起来我们在setEditing 方法中收到的editing 参数已经反转了。 @LeoGalante 啊,看来我们可能已经聊过了。在我的回答中,我使用了对象的 isEditingproperties,这里指的是方法的 editingparameter。前者确实必须反转,因为它只是存储对象的当前状态,而后者,正如您所说,“已经反转”。我似乎两种方法在几乎所有情况下都应该产生相同的结果,但我认为你是对的,使用 editing 更简单,所以我会相应地更新我的答案。误会请见谅!【参考方案2】:

使用操作创建rightBarButtonItem,如下所示。

viewDidLoad()

let rightButton = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("showEditing:"))
    self.navigationItem.rightBarButtonItem = rightButton

然后做一个类似的函数,

 func showEditing(sender: UIBarButtonItem)
 
    if(self.tableView.isEditing == true)
    
        self.tableView.isEditing = false
        self.navigationItem.rightBarButtonItem?.title = "Done"   
    
    else
    
        self.tableView.isEditing = true
        self.navigationItem.rightBarButtonItem?.title = "Edit" 
    

确保将: 附加到Selector 中的函数名称viewDidLoad 中的操作 希望对您有所帮助!

【讨论】:

非常感谢@iRealMe :-)。你如何让它在按下后显示完成,以便它可以让表格退出编辑模式? @richc 更新了我的答案! 这种情况的区别就是为什么你应该只使用内置的editButtonItem 在你的viewWillAppear()覆盖func中,调用showEditing(nil)的func即可。您应该使用可选的栏按钮更新此功能。【参考方案3】:

Swift 3 & 4 回答说恕我直言比其他答案更好

override func viewDidLoad() 
    super.viewDidLoad()

    let editButton = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(toggleEditing)) // create a bat button
    navigationItem.rightBarButtonItem = editButton // assign button


@objc private func toggleEditing() 
    listTableView.setEditing(!listTableView.isEditing, animated: true) // Set opposite value of current editing status
    navigationItem.rightBarButtonItem?.title = listTableView.isEditing ? "Done" : "Edit" // Set title depending on the editing status

为什么我认为它更好

    更少的代码行。 条形按钮会初始化一次,但不是每次按下按钮时都会初始化。

【讨论】:

【参考方案4】:

在按钮点击时调用此方法。

tableView.setEditing(true, animated: true)

或者,如果您希望它像切换一样使用

tableView.setEditing(!tableView.editing, animated: true)

我假设您有一个按钮,按下时会调用editButtonPressed。所以这个方法的实现可能是这样的。

override func viewDidLoad()
 navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))


func editButtonPressed()
  tableView.setEditing(!tableView.editing, animated: true) 
  if tableView.editing == true
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))
  else
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))
  
 

这也改变了栏按钮的标题。

【讨论】:

【参考方案5】:

覆盖视图控制器的-setEditing:animated:,调用super,并在表视图上调用相同的方法。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

    [super setEditing:editing animated:animated];

    [self.tableView setEditing:editing animated:animated];

【讨论】:

我不懂 Swift 语法,只能用 Objective-C 发帖。 我不知道 ObjC 所以我得让别人投票给你的答案!感谢您的帮助!【参考方案6】:

第一:

let editButton = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(showEditing(_:)))
    navigationItem.rightBarButtonItem = editButton

然后:

  @objc func showEditing(_ sender: UIBarButtonItem)
 
    if(self.tableView.isEditing == true)
    
        self.tableView.isEditing = false
        self.navigationItem.rightBarButtonItem?.title = "Edit"
    
    else
    
        self.tableView.isEditing = true
        self.navigationItem.rightBarButtonItem?.title = "Done"
    

【讨论】:

【参考方案7】:

Swift 3.0 版 njuri 贴:

override func viewDidLoad() 
    super.viewDidLoad()

    PackageNameLabel.text = detailPackageName
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))




func editButtonPressed()
    tableView.setEditing(!tableView.isEditing, animated: true)
    if tableView.isEditing == true
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))
    else
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))
    

【讨论】:

感谢您的帮助。但对我来说,只有在 func editButtonPressed() 前面添加 @objc 时它才有效。也许这可以在您的解决方案中更新?【参考方案8】:

您只需要viewDidLoad() 中的 1 行代码即可获得编辑按钮及其相关功能。

navigationItem.rightBarButtonItem = editButtonItem

【讨论】:

以上是关于将表格视图设置为编辑模式的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 在编辑模式下重用单元格

UITableView:重命名编辑按钮(UIBarButtonSystemItemEdit)

更改表格视图中默认删除图标的颜色

在编辑模式下禁用表格视图单元格突出显示的颜色?

在表格视图处于编辑模式时防止更新 NSFetchedResultsController

滑动以删除已处于编辑模式的表格