У меня странная проблема при вызове .navigationController popViewControllerAnimated:YES
из NSOperation
, когда экран не обновляется должным образом и оставляет всплывающее окно видимым, но, по-видимому, освобожденным.
Подробности: у меня есть представление списка, которое обращается к локальной базе данных sqlite
. При нажатии на запись отображается подробное представление этой записи и запускается асинхронная операция NSO (в главном потоке) для проверки внутренней базы данных XML на предмет наличия этой записи в базе данных. По архитектурным причинам я не буду вдаваться в подробности, я не могу запустить эту операцию в представлении списка. Если запись была удалена с момента последней синхронизации, она уведомляет пользователя о том, что запись была удалена, и вызывает popViewControllerAnimated
для делегата общего приложения. В идеале это выскочит текущий подробный вид и вернется к предыдущему списку.
Ошибка: в памяти фактически отображается правильный вид (он был освобожден), но он все еще отображается на экране. Панель навигации пуста, но я могу щелкнуть в том месте, где должна быть кнопка «назад», и она переходит на начальный экран до просмотра списка, что означает, что, по крайней мере, панель навигации понимает, где она должна быть, даже если он не отображает заголовок или кнопки назад правильно. Основная проблема заключается в том, что подробный вид все еще виден и может взаимодействовать, что приводит к сбою приложения. Например, в подробном представлении также отображаются данные в UITableView
, и если пользователь прокручивает таблицу вниз, возникает исключение «-[xAccountDetailController tableView:cellForRowAtIndexPath:]:
сообщение, отправленное на освобожденный экземпляр»
Это наводит меня на мысль, что детальный контроллер был должным образом освобожден при вызове popViewControllerAnimated
, но, очевидно, что-то все еще находится в памяти, если таблица действительно вызывает cellForRowAtIndexPath
, даже если его контроллер представления был отключен навигационный контроллер.
Ручное нажатие кнопки «Назад» в подробном представлении (для записи, которая не была удалена на заднем конце) работает отлично.
Попытки обхода. Когда я передаю в NSOperation ссылку на контроллер подробного представления, я попытался вызвать popViewControllerAnimated
непосредственно из свойства navigationController этого представления и из делегата общего приложения. Я также попытался вытолкнуть два представления и повторно выдвинуть представление списка на navigationController, но это представляет еще более тревожный эффект интерфейса, когда контроллеры представления root и list существуют одновременно на панели навигации (названия перезаписывают друг друга а не несуществующий). Я попытался установить ссылку на контроллер подробного представления, который существует в NSOperation, на ноль, но это ничего не делает. Я пытался вызвать [detailView release]
до появления сообщения, но, как и ожидалось, он не срабатывает во время всплывающего окна, потому что до релиза у него было только 1 счет. Я также пробовал popToViewController
и popToRootViewController
, и, похоже, ничего не работает. Старый вид всегда остается прежним, панель навигации является единственным элементом интерфейса, который, кажется, что-то делает, и даже в этом случае он отображается неправильно. Я также попытался перезагрузить таблицу, потому что я не против, если представление остается видимым (без всплывающих окон), я просто хочу очистить данные - но таблица по какой-то причине не будет перезагружать данные.
Мысли: так как operationQueue, которая выполняет NSOperation, является свойством рассматриваемого подробного представления, я убедился, что в детальном представлении dealloc для cancelAllOperations и для установки ссылки на operationQueue на ноль. Я также пытался убедиться, что все ссылки на это представление в других объектах были установлены в ноль. Вызов popViewControllerAnimated
непосредственно из кнопки в подробном представлении работает отлично, поэтому, должно быть, факт, что я вызываю этот метод из NSOperation, работающего в NSOperationQueue, это свойство подробного представления, которое я хочу отобразить. Некоторая ссылка где-то должна сохранять это представление частично живым, но я не могу найти ничего, что все еще ссылается на представление, когда вызывается pop.
В слишком многих местах слишком много кода, чтобы публиковать его здесь.
Есть мысли?
Извините за такой длинный вопрос и заранее спасибо,
Грег
Редактировать 1:
Я могу легко воспроизвести эту проблему вне NSOperation с новым UIViewController.
В методе tableView:didSelectRowAtIndexPath
я вызываю следующее:
xBaseViewController * vc = [[xBaseViewController alloc] initWithStyle:UITableViewStyleGrouped];
[self.navigationController pushViewController:vc animated:YES];
[vc performSelectorOnMainThread:@selector(popView) withObject:nil waitUntilDone:YES];
В vc метод popView:
[self.navigationController popViewControllerAnimated:YES];
Я не думаю, что это имеет отношение к счетам удержания или операции NSO. Я делаю что-то в корне неправильно, когда выдумываю представление таким образом?