比较tableView中的项目与选定的项目

时间:2019-06-12 08:02:46

标签: arrays swift

我正在从api获取项目,并且想将它们与数组进行比较

例如:获取了items = [1,2,3,4]

我想找到项目[1,2]

并要在tableView上设置复选标记

cellForRowAt()

我用过这个

if(alreadySelectedItems.count != 0) {
        if(dataModel.contains(alreadySelectedItems[indexPath.row])){
            cell.accessoryType = .checkmark
        } else {
            cell.accessoryType = .none
        }
    }

if(alreadySelectedItems.count != 0) {
        if(dataModel[indexPath.row] == alreadySelectedItems[indexPath.row]) {
            cell.accessoryType = .checkmark
        } else {
            cell.accessoryType = .none
        }
    }

dataModel是api的项目列表,而alreadySelecteditems是我的selectedItems

我得到

  

错误:索引超出范围

这是我的tableView扩展功能

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return dataModel.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! CheckableTableViewCell
    cell.dataModel = dataModel[indexPath.row]

    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    selectedItems.append(dataModel[indexPath.row])

}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
{
    selectedItems.removeObject(object: dataModel[indexPath.row])
}

单元格是:

class CheckableTableViewCell: UITableViewCell
{
    var dataModel : String?
    {
        didSet
        {
            guard let model = dataModel else {return}
            textLabel?.text = model
        }
    }
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
        self.tintColor = .primaryColor
    }

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }

    override func setSelected(_ selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)
        self.accessoryType = selected ? .checkmark : .none
    }
}

2 个答案:

答案 0 :(得分:1)

在您的代码中,您正在检查selectedItems[indexPath.row]dataModel的存在,即

dataModel.contains(selectedItems[indexPath.row])

相反,必须相反,即

selectedItems.contains(dataModel[indexPath.row])

这就是它给Index Out of Bounds例外的原因。

只需将tableView(_:cellForRowAt:)的定义更改为

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CheckableTableViewCell
    let dataModel = self.dataModel[indexPath.row]
    cell.dataModel = dataModel
    cell.accessoryType = self.selectedItems.contains(dataModel) ? .checkmark : .none //here..........
    return cell
}

enter image description here

答案 1 :(得分:0)

您可以使用此扩展名来查找数组中的相同元素

extension Array where Element: Hashable {
    func sameElements(from other: [Element]) -> [Element] {
        let firstSet = Set(self)
        let otherSet = Set(other)
        return Array(firstSet.intersection(otherSet))
    }
}