将表格视图设置为编辑模式
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
会为我们处理好这件事,我们使用 tableView
的 setEditing
方法来切换编辑状态表格视图。
来源:
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)) @LeoGalantetableView.isEditing
的值需要反转,因为我们正在切换它。如果它当前正在编辑,那么我们希望它停止编辑。如果它当前没有编辑,那么我们希望它开始编辑。如果我们不反转它,那么它就永远不会改变。
嗨@JaredCleghorn,我不确定,我已经尝试不使用反转并且效果很好,看起来我们在setEditing
方法中收到的editing
参数已经反转了。
@LeoGalante 啊,看来我们可能已经聊过了。在我的回答中,我使用了对象的 isEditing
properties,这里指的是方法的 editing
parameter。前者确实必须反转,因为它只是存储对象的当前状态,而后者,正如您所说,“已经反转”。我似乎两种方法在几乎所有情况下都应该产生相同的结果,但我认为你是对的,使用 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:重命名编辑按钮(UIBarButtonSystemItemEdit)