之前项目中用到tableview的多选操作,今天梳理总结一下
要实现tableview的多选操作有很多种方式.有系统提供的方法,也可以自己通过其他方式实现同样的效果.
第一种,我们使用自己的方式实现多选操作,先看一下效果:
- 这是我们通过自己的方式实现cell的多选效果,首先创建一个Array用于存储或者移除选中cell的IndexPath,在didSelectRowAtindexPath中判断cell是否选中:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let index = selectedCellArray.index(of: indexPath) {
selectedCellArray.remove(at: index)
}else{
selectedCellArray.append(indexPath)
}
//刷新该行cell
self.testTableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
}
- 然后在cellForRowAtindexPath中实现选中和取消选中的效果:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var testCell = tableView.dequeueReusableCell(withIdentifier: "testCell")
if testCell == nil {
testCell = UITableViewCell.init(style: .default, reuseIdentifier: "testCell")
}
//判断cell是否被选中
if selectedCellArray.contains(indexPath) {
testCell?.accessoryType = .checkmark
}else{
testCell?.accessoryType = .none
}
testCell?.textLabel?.text = "\(dataArray[indexPath.row])"
return testCell!
}
第二种,通过系统提供的方式实现,就不需要自己创建array来存储选中的cell.
- 首先,设置tableview的allowsMultipleSelection属性为true
- 在didSelectRowAtindexPath中直接添加选中效果:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)!
cell.accessoryType = .checkmark
}
- 在didDeselectRowAtindexPath中取消选中效果:
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)!
cell.accessoryType = .none
}
第三种,在编辑状态下,实现多选,删除操作:
这个实现起来比较简单:
- 设置tableview的是否允许编辑属性allowsMultipleSelectionDuringEditing为true
_thirdTableView.allowsMultipleSelectionDuringEditing = true
- 选中的cell都会以IndexPath的方式保存在一个集合中,通过tableview的indexPathsForSelectedRows属性直接取出这个集合
selecteds = _thirdTableView.indexPathsForSelectedRows
- 在删除的方法中,删除选中的cell即可
UITableView的多选不难,这里只是讲了几个关键的地方,如果有哪里不明白的可以点击这里下载Demo