UISearchController UITableView didSelectRowAtIndexPath не работает после фильтра - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть UIViewController, который я открываю, представляя его. В нем всего лишь UITableView и UISearchController, которые:

let searchController = UISearchController(searchResultsController: nil)

if #available(iOS 11.0, *) {
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    definesPresentationContext = true
}

Работает хорошо. Я могу фильтровать UITableView каждый раз, когда пользователь обновляет поле UISearchBar.

Моя func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) функция выглядит так:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    dismiss(animated: true, completion: nil)
}

При первом выборе строки после фильтрации UItableView (когда фокус UISearchBar) вызывается мой func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath), но dismiss(animated: true, completion: nil) не работает. Это просто resignFristResponder() UISearchBar.

Затем, если снова выбрать ячейку, теперь, когда UISearchBar больше не фокусируется, dismiss(animated: true, completion: nil) работает.

Так что я должен дважды выбрать ячейку, чтобы увидеть, что мой UIViewController отклонен.

Что с этим не так?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

let searchController: UISearchController = { let search = UISearchController(searchResultsController: nil) search.definesPresentationContext = true search.dimsBackgroundDuringPresentation = false return search }()

Особенно эта строка. Это решило мою проблему в ios 12

dimsBackgroundDuringPresentation = false

Как только метод didSelectRow начнет вызываться, поместите эту строку кода, чтобы закрыть Search Controller.

searchController.dismiss(animated: true, completion: nil)
0 голосов
/ 06 ноября 2018

Попробуйте сначала вызвать dismiss на searchController

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    searchController.dismiss(animated: false)
    dismiss(animated: true)
}

Я только что проверил это, и оно работает независимо от того, активен поиск или нет.

...