清除搜索结果后未保存Swift Tableview搜索结果单元格选择复选标记

问题描述 投票:0回答:1

在我的场景中,我借助于JSONcodable数据列出到Tableview中。在这里,我有一个Tableview和带有过滤器数组的searchBar。同样,使用checkmark选项实现了tableview多单元格选择。在这里,没有搜索选中的单元格复选标记persistant即可正常工作,但是如果我搜索特定数据并选择单元格,则复选标记会显示,但清除搜索结果(fileterarray to tableviewarray)后,复选标记不会显示(这表示所选单元格复选标记未持久且未显示清除搜索结果后)。在某个地方,我在代码库中犯了错误。请更正并提供可靠的解决方案。

实际操作和问题需要允许用户通过启用和不启用搜索的选中标记来选择其单元格。如果不进行搜索,则一切工作正常,但使用搜索后,所选支票将无法保留...

JSON可编码

// MARK: - TeamListRoot
struct TeamListRoot: Codable {
    let status: Bool
    let data: [TeamListData]
}

// MARK: - TeamListData
struct TeamListData: Codable, Hashable {
    let userid: String?
    let firstname, designation: String?
    let profileimage: String?
    var isSelected = false

    private enum CodingKeys : String, CodingKey {
        case userid, firstname, designation, profileimage
    }
}

我的T​​ableview和SearchBar集合

@IBOutlet weak var searchbar: UISearchBar!
@IBOutlet var tableView: UITableView!
var searching = false
var membersData = [TeamListData]()
var filteredData = [TeamListData]()

我的T​​ableview代表

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell:TeamlistCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! TeamlistCustomCell
       let textForRow = searching ? filteredData[indexPath.row] : membersData[indexPath.row]
       cell.empName.text = textForRow.firstname
       cell.designationLabel.text = textForRow.designation
       cell.accessoryType = textForRow.isSelected ? .checkmark : .none
       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}
}

SearchBar代表

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
      self.searchbar.setShowsCancelButton(true, animated: true)
      searching = true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
      self.searchbar.setShowsCancelButton(false, animated: true)
      searching = false
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
      searching = false
      self.searchbar.resignFirstResponder()
      self.searchbar.text = ""
      filteredData.removeAll()
      self.tableView.reloadData()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
       searching = false
       self.searchbar.resignFirstResponder()
       self.searchbar.text = ""
       filteredData.removeAll()
       self.tableView.reloadData()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       if !searchText.isEmpty {
           filteredData = membersData.filter({ ($0.firstname?.localizedCaseInsensitiveContains(searchText))! })
           searching = true
        } else {
            filteredData.removeAll()
            searching = false
        }
        tableView.reloadData()
}
ios swift uitableview searchbar
1个回答
0
投票

正在切换时,您是从filteredData中选择的。完成后,您将从membersData加载项目。在membersData中,您没有选择行。修改您的代码

转到此:

 if  searching == false {
           membersData[indexPath.row].isSelected.toggle()
       } else {
           filteredData[indexPath.row].isSelected.toggle()
       }

至此:

      membersData[indexPath.row].isSelected.toggle()
       filteredData[indexPath.row].isSelected.toggle()
© www.soinside.com 2019 - 2024. All rights reserved.