iPhone / iOS popViewControllerAnimated Не обновляет экран - PullRequest
1 голос
/ 13 сентября 2010

У меня странная проблема при вызове .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. Я делаю что-то в корне неправильно, когда выдумываю представление таким образом?

1 Ответ

2 голосов
/ 13 сентября 2010

Ваша проблема в том, что вы пытаетесь обновить экран в потоке, который не является основным. В iOS вы можете обновлять только то, что происходит на экране с помощью основного потока.

Вам нужен такой код:

[self performSelectorOnMainThread:@selector(mymethod) withObject:nil waitUntilDone:YES modes:nil];

И это должно работать просто денди.

...