Как сохранить галочку после использования поиска в SearchBar? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь создать панель поиска в iOS, и теперь она там, где она фильтрует результаты, а затем, когда вы нажимаете на нее, она показывает галочку. Когда я удаляю текст поиска, флажок исчезает, и появляется полная страница ячеек, но ячейка, выбранная в поиске, не отмечается галочкой. Это реализовано в моей ячейке методом setSelected:

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

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

У меня нет логики с галочкой в ​​методах cellForRowAt и didSelectRowAt. * ​​1004 *

Вот ГИФ моей проблемы

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Я решил свою проблему следующим образом:

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
}
0 голосов
/ 24 апреля 2019

Полагаю, все, что вы сейчас делаете, это устанавливаете галочку в своей ячейке.Ячейка будет использоваться повторно, и вы потеряете галочку.

Что вам нужно сделать, это отслеживать элементы, например, в 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...