Невозможно отобразить целевую сцену после нажатия на строку SearchResultTableView в моем контроллере навигации

Я хочу отфильтровать список записей через UISearchBar и показать детали после того, как пользователь щелкнет строку результатов. Полный список и подробный вид связаны через навигационный контроллер. Обычный вариант использования (без поиска) работает как шарм:

 (ListOfAllEntries)
 => (direct click on row)
 ==> (Details view for row)

Это то, что также должно работать:

(ListOfAllEntries) 
=> (Search)                  - OK!
==> (ListOfFilteredEntries)  - OK!
===> (click on result row)          - OK!
====> (Details view for row) - BOOUUMMM! UI and Nav.Ctrl broken

Я использую UISearchBar (с UISearchDisplayController) для фильтрации базового UITableView. Как Apple рекомендует, отфильтрованные результаты поиска отображаются во втором табличном представлении по умолчанию (searchDisplayController.searchResultsTableView) поверх моего исходного табличного представления со всеми записями.

Все работает нормально - записи фильтруются, и я получаю правильный путь строки результатов indexpath. Пока пользователь не щелкнет строку результатов поиска, и я не хочу показывать подробности для выбранной строки в верхней части контроллера навигации. Мое представление сведений о цели отображается НО, тогда моя программа не работает следующим образом:

  1. целевой экран отображается под панелью навигации (см. изображение № 2)
  2. Если я нажимаю "НАЗАД" на панели навигации, я получаю пустой экран (см. Изображение № 3) и после следующего нажатия НАЗАД мое приложение вылетает) uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview'

Я попытался отобразить целевой вид (сцену) с помощью перехода:

if (tableView == self.searchController.searchResultsTableView) {
    [self performSegueWithIdentifier: @"showFoods" sender: self];
}

и я попытался отобразить целевой вид с помощью прямого нажатия:

FoodViewController *fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FoodViewController"];
[self.navigationController pushViewController:fvc animated:YES];

Оба подхода приводят к одному и тому же неправильному поведению приложения.

Смотрите мои изображения:

  • Почему мой список данных ниже панели навигации?
  • Почему навигационный стек искажается после того, как я нажимаю на сцену с подробностями?

Любая подсказка будет оценена.

UISearchbar в действии:

UISearchbar в действии

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

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

После нажатия кнопки "НАЗАД" сцена со всеми записями не отображается

После нажатия кнопки

Моя раскадровка. Примечание: красная стрелка обозначает проблему. (Последовательность в раскадровке работает хорошо. Но если я хочу грамматически перейти по пути красной стрелки, мой пользовательский интерфейс испорчен!).

Красная стрелка портит пользовательский интерфейс

1 ответ

Решение

Я нашел решение.

Ошибка очень неопределенная. И поэтому трудно найти других людей с такой же проблемой. Наконец я нашел один здесь: навигация в обратном направлении через ошибку UINavigationController

Благодаря приведенному выше такому вопросу, я был на правильном пути: мне пришлось удалить содержимое моего tableView: didSelectRowAtIndexPath: метод.

Почему так? Поскольку UISearchBar был для меня новой темой, я прочитал несколько уроков и несколько вопросов SO. И все они поместили код внутри tableView: didSelectRowAtIndexPath:, Этот код был предназначен для обработки щелчка по строке в таблице результатов поиска. Смотрите здесь: http://www.appcoda.com/how-to-add-search-bar-uitableview/ и здесь: навигация в обратном направлении через ошибку UINavigationController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        [self performSegueWithIdentifier: @"showRecipeDetail" sender: self];        
    }
}

По какой-то причине (может быть, новое поведение iOS7?!) этот код больше не нужен. Еще хуже: этот код создает вышеуказанные проблемы, так как iOS7 автоматически запускает соответствующую последовательность в таблице результатов поиска, а мой ручной триггер вызвал вторую ошибку для запуска. Проблемы возникли в результате двух сеансов с одним и тем же источником и целью.

Поэтому я полностью удалил свой tableView: didSelectRowAtIndexPath: перезаписать метод и все работает как шарм!

Другие вопросы по тегам