Невозможно закрыть представление поиска

У меня есть родительский класс с табличным представлением и панелью поиска над ним, который является подклассом контроллера табличного представления. Делегаты для searchBar и searchdisplaycontroller задаются в отдельном классе, унаследованном от UISearchdisplaycontroller. Источник данных и делегаты для tableview и панели поиска обрабатываются в этом классе отдельно. Классы находятся под ARC.

Следовательно, когда пользователь нажимает на поиск, управление переходит из класса FilesListController (родительский) в этот класс. Теперь, когда пользователь нажимает кнопку отмены, делегат панели поиска устанавливается в этом классе, т.е.

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar  

ВЫЗЫВАЕТСЯ, но НЕ СЛУЖИТ для закрытия полноэкранного представления таблицы поиска и возврата к родительскому контроллеру представления. Однако, если я не пишу этот делегат в классе поиска, он работает правильно. Я установил делегатов панели поиска в xib и при вызове:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

нравится:

self.searchResultsTableView.delegate = self;
self.searchResultsTableView.dataSource = self;
[parentFileViewController.searchDisplayController setDelegate:self];

Где я ошибаюсь? Заранее спасибо.


person tech savvy    schedule 27.08.2012    source источник
comment
[self.searchDisplayController setActive: НЕТ анимированного: ДА];   -  person jussi    schedule 27.08.2012
comment
эй, спасибо @jussi .. это работает !!! Но почему он не отключается сам по себе? Это похоже на то, что мы заставляем searchviewcontroller закрыться.   -  person tech savvy    schedule 27.08.2012
comment
потому что некоторые хотят сохранить некоторую информацию перед закрытием контроллера. Я опубликую это как ответ.   -  person jussi    schedule 27.08.2012


Ответы (3)


Если вы хотите закрыть UISearchBar с помощью SearchBarController, просто используйте этот код:

[self.searchDisplayController setActive:NO animated:YES];
person jussi    schedule 27.08.2012

вы должны реализовать отказ от ответчика в функции делегата, т.е.

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar {
      [searchBar resignFirstResponder];
 }
person cekisakurek    schedule 27.08.2012
comment
Это просто закрывает клавиатуру, но не закрывает представление поиска и кнопку отмены. - person tech savvy; 27.08.2012

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

Мы справляемся с такой ситуацией, обнуляя наши массивы:

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];

if([self isViewLoaded] && self.view.window == nil)
{
    self.view = nil;
    keys = nil;
    names = nil;
    errorDuringNetworkCall = nil;
}
}

И отклонив табличное представление панели поиска перед выполнением операции перехода:

[self performSegueWithIdentifier:@"navigateToNextScreen" sender:self];
self.searchBar.text = @"";
[self.searchDisplayController setActive:NO animated:YES];

После получения предупреждения о памяти метод viewDidLoad вызывается снова, и массивы заполняются, панель поиска по-прежнему будет полезной. Работайте без проблем.

person user3371114    schedule 02.03.2014
comment
Я вообще не вижу в этом ответа на вопрос - person Daniel Galasko; 20.10.2014