Перезагрузка представления после поиска приводит к сбою приложения - PullRequest
0 голосов
/ 06 января 2012

Я делаю приложение, у которого есть представление с UITableView с UISearchDisplayController.Данные поступают с NSFetchedResultsController.Все работает нормально: я получаю данные, представление таблицы заполняется, поиск работает отлично.Единственная проблема заключается в том, что если я выполняю поиск и затем нажимаю «Отмена» (без удаления текста из UISearchBar), а затем возвращаюсь к предыдущему контроллеру представления и затем возвращаюсь к тому же представлению с UITableView и UISearchDisplayController, он падает сэто записывается в журнал:

2012-01-06 16: 46: 37.559 MyApp [9586: 207] *** - [SomeRandomViewController controllerWillChangeContent:]: сообщение отправлено в освобожденный экземпляр 0x778d060

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

И если я сделаю несколькопоиск, затем удалите текст из строки поиска, а затем нажмите «Назад» и вернитесь к этому представлению, оно прекрасно работает.

Немного кода:

- (void)viewDidUnload {
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

  self.fetchedResultsController = nil;
  self.searchFetchedRC = nil;
  [super viewDidUnload];
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {

  self.fetchedResultsController = nil;
  [self fetchedResultsController];
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  self.searchDisplayController.searchBar.text = @"";
  self.searchDisplayController.active = NO;
  [self searchDisplayControllerWillEndSearch:self.searchDisplayController];
  return YES;
}

Любойбудет признательна за помощь

Обновление

Без зомби вывод в журнал:

2012-01-09 09:25:48.128 бутан [17325: 207] - [UITextMagnifierTimeWeightedPoint controllerWillChangeContent:]: нераспознанный селектор отправлен в экземпляр 0x8251dc0

Update 2

Метод Dealloc:

- (void)dealloc {
  [self.mySearchDisplayController release];
  self.mySearchDisplayController.delegate = nil;
  self.mySearchDisplayController = nil;
  [self.fetchedResultsController release];
  self.fetchedResultsController.delegate = nil;
  self.fetchedResultsController = nil;
  [self.searchFetchedRC release];
  self.searchFetchedRC.delegate = nil;
  self.searchFetchedRC = nil;
  [self.tableView release];
  [textView release];
  self.tableView = nil;
  self.tableView.delegate = nil;
  [super dealloc];
}

mySearchDisplayController = UISearchDisplayController

fetchedResultsController and searchFetchedRC = NSFetchedResultsControllers

tableView = UITableView

textView = [HPGrowingTextView][1]

Update 3

Вдохновленный ответом Tia, я установил значения FRC и их делегатов равными нулю в методе searchDisplayControllerWillEndSearch.Работает пока хорошо

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {

  self.fetchedResultsController.delegate = nil;
  self.fetchedResultsController = nil;
  self.searchFetchedRC.delegate = nil;
  self.searchFetchedRC = nil;
  [self fetchedResultsController];
}

Ответы [ 2 ]

1 голос
/ 09 января 2012

У меня была похожая проблема, так как мой VC реализовал протокол UISearchBarDelegate и searchBarTextDidEndEditing: вызывался после Я отклонил VC в tableView: didSelectRowAtIndexPath: метод.

Я исправилэто с:

self.searchDisplayController.delegate=nil;
self.searchDisplayController.searchBar.delegate=nil;

до

[self dismissModalViewControllerAnimated:YES];
1 голос
/ 09 января 2012
- (void)dealloc {
  //[self.mySearchDisplayController release];
  self.mySearchDisplayController.delegate = nil;
  self.mySearchDisplayController = nil;
  //[self.fetchedResultsController release];
  self.fetchedResultsController.delegate = nil;
  self.fetchedResultsController = nil;
  //[self.searchFetchedRC release];
  self.searchFetchedRC.delegate = nil;
  self.searchFetchedRC = nil;
  //[self.tableView release];
  [textView release];
  self.tableView.delegate = nil;
  self.tableView = nil;
  [super dealloc];
}

Вы чрезмерно освобождаете свои свойства, так как установка его на nil уже освобождает его для сохраненных свойств. Я попытался удалить дополнительный код выпуска, комментируя его, поэтому, пожалуйста, попробуйте заменить ваш dealloc на мой код выше и посмотрите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...