我有一个搜索栏可以过滤我的数组。我在几天内尝试做的是在点击单元格时添加一个复选标记。我知道如何添加复选标记,但我不知道如何在我搜索时将复选标记保留在同一个单元格中,而当我不搜索时。
现在我正在尝试创建一个显示所有已检查行的数组:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if schouldShowSearchResults{
if checkedArrray.contains(filteredData[indexPath.row]){
checkedArrray.remove(at: checkedArrray.index(of: filteredData[indexPath.row])!)
}else{
checkedArrray.append(filteredData[indexPath.row])
}
}else{
if checkedArrray.contains(array[indexPath.row]){
checkedArrray.remove(at: checkedArrray.index(of: array[indexPath.row])!)
}else{
checkedArrray.append(array[indexPath.row])
}
}
print(schouldShowSearchResults)
print(checkedArrray)
}
CellforRowAt:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = serialNumberTableView.dequeueReusableCell(withIdentifier: "serialNumbers") as! SerialNumberCell
if schouldShowSearchResults{
cell.serialNumberLabel.text = filteredData[indexPath.row]
}else{
cell.serialNumberLabel.text = array[indexPath.row]
}
return cell
}
所以我现在想知道如何为所有与checkedArray具有相同文本值的单元格添加复选标记?
答案 0 :(得分:0)
最好的办法是在self.tableView.reloadData()
方法的底部调用didSelect
。
然后,在每次重新加载表时调用的cellForRow
方法中,只需查看该单元格的文本值是否等于所需的checkedArray(即它是否应显示复选标记) )
最后,如上所述,如果文本值相等或不相等,那么您的单元格可以以UIImageView
形式的复选标记在isHidden
之间切换为true或false。
答案 1 :(得分:0)
不是使用单独的数组来跟踪复选标记,而是在数据模型中添加didSelectRowAt
字段。这样,是否应该检查行的状态与数据模型相关联,而不是单独的数组。
这使得处理表视图数据的过滤和排序变得更加简单,而不会试图保持其他单独的数据同步。
然后在您的selected
方法中,您应该获取给定indexPath的数据模型,切换其checked
(或didSelectRowAt
)属性,然后告诉表视图重新加载该属性indexPath。这使得{{1}}中的代码变得更加简单和清晰。
答案 2 :(得分:0)
因此经过几天的研究后我发现使用结构阵列是最好的。我做了两个数组,一个过滤,一个正常。
struct filtered{
var text_filtered: String
var isChecked_filtered: Bool = false
}
struct normal{
var text: String
var isChecked: Bool = false
}
在我的didSelectRowAt函数中,我确实喜欢这样:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if schouldShowSearchResults{
if filteredDataArray[indexPath.row].isChecked == false{
filtered
filteredDataArray[indexPath.row].isChecked = true
let indexOfArray = array.index { $0.text == filteredDataArray[indexPath.row].text_filtered}
array[indexOfArray!].isChecked = true
print(filteredDataArray[indexPath.row])
}else{
filteredDataArray[indexPath.row].isChecked = false
let indexOfArray = array.index { $0.text == filteredDataArray[indexPath.row].text_filtered}
array[indexOfArray!].isChecked = false
print(filteredDataArray[indexPath.row])
}
}else{
if array[indexPath.row].isChecked == false{
array[indexPath.row].isChecked = true
print(array[indexPath.row])
}else{
array[indexPath.row].isChecked = false
print(array[indexPath.row])
}
}
tableView.reloadData()
}
在此之后我也偶然发现了一个问题。事实证明我的细胞是可重复使用的,因此每次我在tableView中滚动时,我的复选标记都被重新排序。我在cellForRowAt中这样做了解决这个问题:
let cell = tableView.dequeueReusableCell(withIdentifier: "defaultCell") as! customCellClass
if schouldShowSearchResults{
cell.accessoryType = filteredDataArray[indexPath.row].isChecked ? .checkmark : .none
cell.stringLabel.text = filteredDataArray[indexPath.row].text_filtered
}else{
cell.accessoryType = array[indexPath.row].isChecked ? .checkmark : .none
cell.stringLabel.text = array[indexPath.row].text
}
return cell