UISearchController — как выбрать результаты из отфильтрованной таблицы

Я работаю над добавлением панели поиска в существующее приложение.

У меня есть таблица, заполненная данными, загруженными с сервера, и я использую новый UISearchController.

Теперь у меня есть панель поиска, которая полностью работает и отображает новую отфильтрованную таблицу результатов по мере того, как пользователь вводит в строку поиска.

Мой вопрос: как обрабатывать пользователя, выбирающего элемент из этой новой отфильтрованной таблицы результатов поиска?

Я добавил новый переход из моей отфильтрованной таблицы и добавил didSelectRowAtIndexPath, который работает нормально, но когда пользователь выбирает элемент из отфильтрованной таблицы, панель поиска остается, и нажатие кнопки «Отмена» после этой точки приводит к сбою приложения.

Итак, я не уверен, что я должен делать и как я должен обрабатывать пользователя, выбирающего элементы из отфильтрованной таблицы?

Оставить все как есть, но добавить код для отмены панели поиска, когда пользователь выбирает элемент?

Или я делаю это неправильно, и есть способ передать выбор из отфильтрованной таблицы обратно в основную таблицу контроллера представления при выборе пользователем отфильтрованного элемента?

Любая помощь, как всегда, очень благодарна!


person R2D2    schedule 24.08.2015    source источник


Ответы (4)


После инициализации searchController попробуйте установить следующее свойство searchController, которое активирует didSelectRowAtIndexPath метод UITableViewDelegate.

searchController.obscuresBackgroundDuringPresentation = false
person Mohammed Shakeer    schedule 28.02.2018

Попробуйте закрыть панель поиска, когда пользователь выбирает отфильтрованную строку таблицы:

[yourSearchController.searchBar resignFirstResponder];
person Gjchoza    schedule 24.08.2015
comment
Я не думаю, что это уволит контроллер поиска. я бы использовал [yourSearchController dismissViewControllerAnimated:YES completion:nil]; - person Kenneth P. Hough; 30.01.2017

Любая выборка таблицы, как известно, выполняется по методу

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Все, что вам нужно сделать, это добавить условие в метод didSelectRowAtIndexPath:, чтобы различать «полную» таблицу данных и «отфильтрованную» таблицу данных.

В приведенном ниже примере кода я использую Singleton с именем UserData для хранения моего выбора, но существует много разных реализаций, и предложения приветствуются. (Я не буду вдаваться в подробности о синглтонах, но если вам интересно, посмотрите это блог Мэтта Гэллоуэя).

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (mySearchController.active) {
        // if the search bar is active use filteredData array
        [[UserData sharedUserData] setSelection:filteredData[indexPath.row]];
        // here you can add your segue code
    } else {
        // if search bar is not active then use the full data set
        [[UserData sharedUserData] setSelection:unfilteredData[indexPath.row]];
        // here you can add your segue code
    }

    // Optional:
    //  if you would like to add a checkmark for selection
    // first remove any existing checkmarks
    for (UITableViewCell *cell in [tableView visibleCells]) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    // then add new check mark
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    // and lastly tell the selected cell to deselect
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Надеюсь, это поможет. Дайте мне знать, если у вас есть какие-либо вопросы или какие-либо предложения по улучшению этого. :)

person Kenneth P. Hough    schedule 30.01.2017

Вероятно, вы пытаетесь представить новый контроллер из контроллера стола. Не делайте этого таким образом, вы должны представить его из контроллера панели поиска.

person Pablo A.    schedule 24.08.2015
comment
Просто передайте выбор таблицы контроллеру панели поиска, вы можете использовать собственный метод делегата. Как только контроллер поиска получит вызов делегата, вы можете представить новый контроллер оттуда. Здесь вы можете проверить, как создать делегата в цели c"> stackoverflow.com/questions/626898/ - person Pablo A.; 24.08.2015