如何从数组中删除项目?

时间:2018-02-13 14:21:39

标签: swift uitableview swift4

我有一个多选的桌面视图。

我在做什么:当用户选择项目时,此项目会附加到数组中。

当用户从单元格取消选择该项目时,此取消选择的项目将从阵列中删除。

我做了什么:

我的数组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

    }

}

2 个答案:

答案 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)