【问题标题】:Swift Tableview search result selected cell checkmark not persistingSwift Tableview 搜索结果选择的单元格复选标记不持久
【发布时间】:2019-11-18 17:39:57
【问题描述】:

我正在使用 Codable 将我的 JSON 中的数据加载到 UITableView 中。在这里,Tableview 我实现了多个单元格选择复选标记选项。我将两个数组用于正常数据加载,另一个用于过滤数组数据。在这里,每一个选择我都附加isSelected 用于复选标记持久性。带有复选标记单元格选择的正常数据加载工作正常。但是,每当我尝试搜索并选择显示在搜索结果中的复选标记时,但在清除搜索数据后,我无法在 tableview 中看到搜索选择的复选标记。

我使用两个数组,一个用于normal 数据加载另一个用于tableview search 数据。搜索清楚后如何实现checkmark可用性。

我的代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return searching ? filteredData.count : membersData.count
}

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:listCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! listCustomCell
    let textForRow = searching ? filteredData[indexPath.row] : membersData[indexPath.row]
       cell.empName.text = textForRow.firstname
       cell.designationLabel.text = textForRow.designation
       return cell
}

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            self.tableView.deselectRow(at: indexPath, animated: true)
            if  searching == false {
                membersData[indexPath.row].isSelected.toggle()
            } else {
                filteredData[indexPath.row].isSelected.toggle()
            }
            tableView.reloadRows(at: [indexPath], with: .none)
            let selectedAreas = membersData.filter{$0.isSelected}
            let selectedfilterAreas = filteredData.filter{$0.isSelected}
            print("\(selectedAreas)")
            print("\(selectedfilterAreas)")
        }

【问题讨论】:

  • 添加你的 cellForRowAt 函数,这是罪魁祸首,可能出队细胞是问题!
  • @ShivamGaur 我更新了我的问题。你能检查一下吗?

标签: ios swift uitableview


【解决方案1】:

您的逻辑不正确,因为您没有更新数据源 搜索关闭时显示数据。 解决方案是当您切换过滤后的数组时,请同时切换作为您的 membersData 的原始数据源数组!!。 必须有一个区分员工的关键,因此当您在搜索时选择员工时,请更新该员工的 membersData isSelected。

编辑过多:p
eq - // 我假设 emp_id 是唯一键。 membersData 也是可变的

CODE -
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.tableView.deselectRow(at: indexPath, animated: true)
        if  searching == false {
            membersData[indexPath.row].isSelected.toggle()
        } else {
            filteredData[indexPath.row].isSelected.toggle()
            let empId = filterdData[indexPath.row].emp_id
            for (index,obj) in membersData.enumerated() {
             membersData[index].isSelected = obj.emp_id == empId ? filteredData[indexPath.row].isSelected : obj.isSelected
             }
        tableView.reloadRows(at: [indexPath], with: .none)
        let selectedAreas = membersData.filter{$0.isSelected}
        let selectedfilterAreas = filteredData.filter{$0.isSelected}
        print("\(selectedAreas)")
        print("\(selectedfilterAreas)")
    }

【讨论】:

  • 谢谢你,我会在这里尝试更新你。非常感谢!
  • 我需要在这里提供什么。 [YourObjectType]?
  • 我在Cannot assign to property: 'obj' is a 'let' constantCannot convert value of type '()' to closure result type '[TeamListData]' 线上遇到错误let userID = filteredData[indexPath.row].userid membersData.map { (obj) -> [TeamListData] in obj.isSelected = obj.userid == userID ? filteredData[indexPath.row].isSelected : obj.isSelected }
  • 嗨,哥们,你能告诉我为什么会出现这个错误吗?
  • 伟人。工作魅力。太感谢了。我从你的代码中学到了很多东西。超级:)
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多