【问题标题】:Remove objects from array when deselect table view取消选择表格视图时从数组中删除对象
【发布时间】:2019-02-27 02:21:56
【问题描述】:

我有一个表格视图,其中显示了具有 id、名称、价格和数量 的事物列表(从 itemsArr 数组 获得)。当我选择一个商品时,我会将商品的详细信息名称、价格、数量添加到一个数组(项目数组)。当我取消选择商品时,已附加到该数组中的商品的详细信息(名称、价格、数量 strong>应该删除。我没有问题将详细信息附加到数组中,但我的问题是我不知道从大批。以下是我的代码:

var item = MyList()
var items = [MyList]()
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .checkmark

        if let itemSel = itemsArr?[indexPath.row] {
            delegate?.didSelectItemsListItem(id: itemSel.id, name: itemSel.name, price: itemSel.price)
            // Add item details into array
            item.id = itemSel.id
            item.name = itemSel.name
            item.price = itemSel.price
            item.quantity = 1
            self.items.append(item)
            print("Added items: ", self.items)
        }
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .none
        // Remove item details from array
        if let itemdeSel = itemsArr?[indexPath.row] {
            delegate?.didDeselectItemsListItem(id: itemdeSel.id, name: itemdeSel.name, price: itemdeSel.price)
            if let index = itemsArr?.index(where: { $0.id == itemdeSel.id }) {
                // removing item
                self.items.remove(at: index)
                print("Items after removed: ", self.items)
            }
        }
    }

注意到所有商品的数量都是 1。我想尝试使用过滤方法,但我担心所有数量的其他项目也会被删除,因为数量是相同的。下面是 items 数组的示例(项目已附加到其中:

 [(id: 4, name: "book", price: "3.00", quantity: 1), (id: 2, name: "pen", price: "1.00", quantity: 1)]

更新: 我实际上可以只使用过滤器方法。我不知道过滤方法可以删除该项目的全部细节。下面是我最终的 deSelect 代码:

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    cell?.accessoryType = .none
    // Remove item details from array
    if let itemdeSel = itemsArr?[indexPath.row] {
        delegate?.didDeselectItemsListItem(id: itemdeSel.id, name: itemdeSel.name, price: itemdeSel.price)
        let filteredArray = self.items.filter { $0.id != itemdeSel.id }
        self.items.removeAll()
        self.items = filteredArray
        print("Items after removed: ", self.items)
    }
}

【问题讨论】:

  • 如果id 的值是唯一的,那么它为什么要删除其他所有值?
  • didSelectRowAt 中的这个 item 变量是什么?是实例变量吗?
  • @SShahid,对不起,我不明白你的问题。但是,是的,id 值是唯一的。您指的是过滤方法吗?
  • @Tj3n, var item = MyList(), MyList 是一个模型。并且 items 数组来自 var items = [MyList]()
  • @Lynn,在您的 didDeselectRowAt 函数中,您正在删除对象。如果您通过检查它们的id 来删除它们,为什么您认为过滤方法不起作用? :)

标签: ios arrays swift object


【解决方案1】:

如果你有一个数组itemsArr,并且你知道要删除的项目的id,你可以简单的使用,

let filteredArray = itemsArr.filter { $0.id != idToDelete }

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多