使用SearchBar时,CheckView与TableView中的错误行相关联

时间:2018-04-25 15:42:31

标签: swift uitableview uisearchbar accessorytype

我正在创建一个应用程序,当用户在TableView中搜索某个项目时,他们可以单击它,并在其旁边显示一个复选标记。但是,当我选择我搜索的第一个项目并点击它然后删除我的搜索时,复选标记停留在第一行但是对于一个完全不同的对象,我搜索,开始(见下图)。

When Searching

When not Searching

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 :(得分:1)

欢迎使用TableViewController逻辑。这看起来很奇怪,但它的工作正确) 您需要覆盖ExtraSymptomCell中的prepareForReuse()方法。并清除您的单元格包含的所有值,包括accessoryType

override func prepareForReuse() {
    super.prepareForReuse()

    accessoryType = .none
}

在你的tableView(_ 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()
    }
}

答案 1 :(得分:0)

由于UITableViewCell被重复使用,因此当您重新加载表数据时,复选标记将出现在单元格中。

在cellForRowAt中,将accessoryType设置为.none,以删除以前选中的单元格复选标记:

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

这将删除上一次搜索中的支票。