我有一个多选的桌面视图。
我在做什么:当用户选择项目时,此项目会附加到数组中。
当用户从单元格取消选择该项目时,此取消选择的项目将从阵列中删除。
我做了什么:
我的数组:var selectedTagList:[Tag] = []
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.tagTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
self.selectedTagList.append(tagList![indexPath.row])
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
self.tagTableView.cellForRow(at: indexPath)?.accessoryType = .none
self.selectedTagList.remove(at: indexPath.row)
}
请提供任何建议或示例代码?
//数据源和代理
extension PickVideoViewController : UITableViewDataSource,UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let tlist = self.tagList , !tlist.isEmpty else { return 1}
return tlist.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let tlist = self.tagList , !tlist.isEmpty else {
let cell = UITableViewCell()
cell.selectionStyle = .none
cell.backgroundColor = .clear
cell.textLabel?.textAlignment = .center
cell.textLabel?.textColor = UIColor.black
cell.textLabel?.text = "nodataavaiable".localized()
return cell }
let cell = tableView.dequeueReusableCell(withIdentifier: "TagCell", for: indexPath) as! TagCell
cell.tagName.text = tlist[indexPath.row].tag
cell.accessoryType = cell.isSelected ? .checkmark : .none
cell.selectionStyle = .none // to prevent cells from being "highlighted"
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.tagTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
self.selectedTagList.append(tagList![indexPath.row])
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
self.tagTableView.cellForRow(at: indexPath)?.accessoryType = .none
self.selectedTagList.remove(at: <#T##Int#>)
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard let tlist = self.tagList , !tlist.isEmpty else {return tableView.frame.height }
return 40
}
}
答案 0 :(得分:0)
您无需维护所选项目的列表。您已经拥有所有项目,tableView可以告诉您选择了哪些行/项目。
https://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows
讨论
此属性的值是index-path数组 每个对象通过其section和row索引标识一行。该 如果没有选定的行,则此属性的值为nil。
你正试图重新发明轮子。请务必查看文档以了解现有功能。
如果您想要一个选定项目的列表,您只需在这些索引路径上创建一个项目数组,如下所示:(未经测试)
let selectedItems = tableView.indexPathsForSelectedRows().map {
self.tagList[$0.row]
}
此代码将遍历索引路径并从每个数组返回项目。 (这是未经测试的,您可能需要在更改类型时使用flatMap)
答案 1 :(得分:0)
self.selectedTagList.remove(at: indexPath.row)
indexPath.row
是要删除的错误值。由于您的数据源是基于tagList
而不是selectedTagList
填充的,因此您需要从tagList
中获取该项目,并在selectedTagList
中找到相应的项目。
您无法显示tagList
中的对象类型,但您可能需要使它们符合Equatable
,以便您可以执行此查找。一旦你做了,你应该有这样的事情:
let deselectedTag = self.tagList[indexPath.row]
// You will need the items in `tagList` to conform to `Equatable` to do this
guard let indexOfDeselectedTag = self.selectedTagList.index(of: deselectedTag else) {
// Data inconsistency: the item wasn't found in selectedTagList
return
}
self.selectedTagList.remove(at: indexOfDeselectedTag)