сравнить элементы в tableView с выбранными элементами - PullRequest
0 голосов
/ 12 июня 2019

Я получаю элементы из 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

.

Я получаю

Ошибка: indexOut диапазона

вот мой стол. Функции расширения

 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 ]

1 голос
/ 12 июня 2019

В вашем коде вы проверяете наличие 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

0 голосов
/ 12 июня 2019

вы можете использовать это расширение, чтобы найти те же элементы, если ваши массивы

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