在SearchBar中使用搜索后如何保存对勾标记?

时间:2019-04-23 12:16:08

标签: swift tableview uisearchbar checkmark

我正在尝试在iOS中制作一个搜索栏,并使其到达可以过滤结果的位置,然后单击它时,它会显示一个选中标记。当我删除搜索文本时,复选标记消失,并显示整个单元格页面,但是未在我的搜索中选择的单元格带有复选标记。这是通过setSelected方法在我的单元中实现的:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        accessoryType = .checkmark
    } else {
        accessoryType = .none
    }
}

在cellForRowAt和didSelectRowAt方法中我没有带复选标记的逻辑。

Here is a GIF of my problem

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我认为您当前正在做的就是在单元格上设置选中标记。该单元将被重复使用,您将失去选中标记。

您需要做的是跟踪项目,例如在Set中,表示用户已经检查了。在表格视图中呈现项目时,您需要参考此集合是否检查了项目。如果是这样,您将要在单元格中添加复选标记。

Item是您的单元格模型的情况下,遵循这些原则。这应该使您入门。您应该能够将此扩展到具有表标题组的数据集。

/// The items that have been checked.
var checkedItems = Set<Item>()

/// All items that are shown when no search has been performed.
var allItems: [Item]

/// The currently displayed items, which is the same as `allItems` in case no
/// search has been performed or a subset of `allItems` in case a search is
/// currently active.
var displayedItems: [Item]

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let item = displayedItems[indexPath.row]
    let cell = // Construct your cell as usual.

    if checkedItems.contains(item) {
        cell.accessoryType = .checkmark
    } else {
        cell.accessoryType = .none
    }

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let item = displayedItems[indexPath.row]

    if checkedItems.contains(item) {
        checkedItems.remove(item)
        cell.accessoryType = .none
    } else {
        checkedItems.insert(item)
        cell.accessoryType = .checkmark
    }
}

func updateSearchResults(for searchController: UISearchController) {
    displayedItems = // Set the displayed items based on the search text.
    tableView.scrollRectToVisible(.zero, animated: false)
    tableView.reloadData()
}

答案 1 :(得分:0)

我以这种方式解决了我的问题:

var selectedCellIndex: String?

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let key = sectionTitles[indexPath.section]
    if let values = dictionary[key] {
        selectedCellIndex = values[indexPath.row]
    }
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()
}

public func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    tableView.cellForRow(at: indexPath)?.accessoryType = .none
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.tintColor = Color.main()
    cell.selectionStyle = .none
    let key = sectionTitles[indexPath.section]
    if let values = dictionary[key] {
        cell.textLabel?.text = values[indexPath.row]
        if values[indexPath.row] == selectedCellIndex {
            cell.accessoryType = .checkmark
        }
    }
    return cell
}