Галочка связана с неправильной строкой в ​​TableView при использовании SearchBar - PullRequest
0 голосов
/ 25 апреля 2018

Я создаю приложение, в котором, когда пользователь ищет элемент в TableView, он может щелкнуть по нему, и рядом с ним появляется галочка.Однако, скажем, когда я выбираю первый искомый элемент и нажимаю на него, а затем удаляю поиск, флажок остается в первой строке, но для совершенно другого объекта, который я искал, для начала (см. Изображения ниже).

При поиске

Когда не выполняется поиск

var searchingArray = [Symptoms]()
var filteredArray = [Symptoms]()

var selectedSymptoms = [Symptoms]()

var clicked = [String]()

var searchingUnderWay = false

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if let cell = searchingSymptomsTableView.dequeueReusableCell(withIdentifier: "ExtraSymptoms", for: indexPath) as? ExtraSymptomCell {

        let searchingArrays: Symptoms!

        if searchingUnderWay {

            searchingArrays = self.filteredArray[indexPath.row]


        } else {

            searchingArrays = self.searchingArray[indexPath.row]

        }

        cell.updateUI(symptomNames: searchingArrays)

        return cell

    } else {

        return UITableViewCell()
    }


}

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedRow: Symptoms!

    let symptomName: String!

    let cell : UITableViewCell = tableView.cellForRow(at: indexPath)!

    if searchingUnderWay {

        selectedRow = filteredArray[indexPath.row]
        symptomName = filteredArray[indexPath.row].name as String

        if clicked.contains(symptomName) {

            cell.accessoryType = .none

            let indexNumber = clicked.index(of: symptomName)
            clicked.remove(at: indexNumber!)

            if let element = selectedSymptoms.index(where: { $0.name == selectedRow.name }) {

                selectedSymptoms.remove(at: element)
            }

        } else {

            clicked.append(symptomName)

            cell.accessoryType = .checkmark

            searchingSymptomsTableView.reloadData()

            selectedSymptoms.append(selectedRow)

        }



    } else {

        selectedRow = searchingArray[indexPath.row]
        symptomName = searchingArray[indexPath.row].name as String

        if clicked.contains(symptomName) {

            cell.accessoryType = .none

            let indexNumber = clicked.index(of: symptomName)
            clicked.remove(at: indexNumber!)

            if let element = selectedSymptoms.index(where: { $0.name == selectedRow.name }) {

                selectedSymptoms.remove(at: element)
            }

        } else {

            clicked.append(symptomName)

            cell.accessoryType = .checkmark

            searchingSymptomsTableView.reloadData()

            selectedSymptoms.append(selectedRow)

        }


        print(clicked)
        print(selectedSymptoms)



    }

}

Я хочу, чтобы элемент, который я искал с помощью панели поиска, все еще проверялся приВы удаляете поиск.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Добро пожаловать в логику TableViewController.Это кажется странным, но работает правильно. Вам нужно переопределить метод prepareForReuse () в вашем ExtraSymptomCell.И очистите все значения, которые содержит ваша ячейка, включая accessoryType

override func prepareForReuse() {
    super.prepareForReuse()

    accessoryType = .none
}

В вашем табличном представлении (_ tableView: UITableView, cellForRowAt indexPath: IndexPath):

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = searchingSymptomsTableView.dequeueReusableCell(withIdentifier: "ExtraSymptoms", for: indexPath) as? ExtraSymptomCell {

        let symptomName: String!

        let searchingArrays: Symptoms!

        if searchingUnderWay {

            searchingArrays = self.filteredArray[indexPath.row]
            symptomName = filteredArray[indexPath.row].name as String

        } else {

            searchingArrays = self.searchingArray[indexPath.row]
            symptomName = filteredArray[indexPath.row] as String
        }

        cell.updateUI(symptomNames: searchingArrays)

        if clicked.contains(symptomName)  {
            cell.accessoryType = .checkmark
        } else {
            cell.accessoryType = .none
        }

        return cell

    } else {

        return UITableViewCell()
    }
}
0 голосов
/ 25 апреля 2018

Поскольку UITableViewCell используется повторно, флажок появится в ячейке при перезагрузке данных таблицы.

В cellForRowAt установите для accessoryType значение .none, чтобы удалить ранее проверенную галочку ячейки:

let cell : UITableViewCell = tableView.cellForRow(at: indexPath)!
cell.accessoryType = .none

Это уберет чек из предыдущего поиска.

...