如何从数组中删除项目?

Posted

技术标签:

【中文标题】如何从数组中删除项目?【英文标题】:How to remove item from Array? 【发布时间】:2018-02-13 14:21:39 【问题描述】:

我有一个多选的表格视图。

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

当用户从单元格中取消选择项目时,这个取消选择的项目从数组中删除。

我做了什么:

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

    


【问题讨论】:

那么问题是什么? 问题是当 ı remove : out of bounds 你能展示你的 UITableViewDataSource 吗? 如果您选择第 10 个单元格,这是您的第二个选择。该数组将仅包含 2 个项目。您正试图在索引 9 处删除。这是超出范围的。 如果将数字 7 和数字 9 插入到数组中,它将有两个项目。然后您尝试删除第 7 项。看到这里的问题了吗? 【参考方案1】:
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)

【讨论】:

【参考方案2】:

您不需要维护所选项目的列表。您已经拥有了所有项目,并且 tableView 可以告诉您选择了哪些行/项目。

https://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows

讨论

这个属性的值是一个index-path数组 每个对象都通过其部分和行索引标识一行。这 如果没有选定的行,则此属性的值为 nil。

您正在尝试重新发明***。始终检查文档以了解现有功能。

如果您想要从中选择项目的列表,您只需在这些索引路径处创建一个项目数组,如下所示:(未经测试)

let selectedItems = tableView.indexPathsForSelectedRows().map   
     self.tagList[$0.row] 

此代码将遍历索引路径并在每个索引路径中返回数组中的项目。 (这是未经测试的,您可能需要在更改类型时使用 flatMap)

【讨论】:

以上是关于如何从数组中删除项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 中的多维关联数组中删除项目

如何从由类中的函数组成的数组中删除项目?

如何在反应中从状态数组中添加或删除项目

如何从 laravel 中的会话数组中删除项目

如何在AngularJS中使用过滤器从数组中删除项目?

如何从 Java 的组合框中删除特定项目?