如何在使用tableview和搜索栏时添加复选标记

时间:2018-02-18 23:30:11

标签: arrays swift uitableview uisearchbar

我有一个搜索栏可以过滤我的数组。我在几天内尝试做的是在点击单元格时添加一个复选标记。我知道如何添加复选标记,但我不知道如何在我搜索时将复选标记保留在同一个单元格中,而当我不搜索时。

现在我正在尝试创建一个显示所有已检查行的数组:

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具有相同文本值的单元格添加复选标记?

3 个答案:

答案 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