Таким образом, у меня есть стек из трех UITableViewControllers, каждый из которых правильно отображает свой вид под панелью навигации, когда я вручную нажимаю на интерфейс.
Однако сейчас я работаю над восстановлением состояния при перезапуске приложения, поэтому я помещаю те же два контроллера поверх корневого контроллера представления, по одному, тем же способом в главном потоке. То, что в итоге происходит, так это то, что представление среднего контроллера расположено слишком далеко вниз, а представление верхнего контроллера слишком далеко (под панелью навигации).
Соответствующий код:
for (int i = 0; i < [controllerState count]-1; i++) {
MyViewController* top = (MyViewController*)navigationController.topViewController;
int key = [[controllerState objectAtIndex:i] integerValue];
[top restoreNextViewController:key]; // this calls pushViewController:
// so top will be different in the next iteration
}
Я подозреваю, что проблема в том, что я не позволяю некоторому важному процессу обновления пользовательского интерфейса происходить между двумя нажатиями, потому что они происходят в одном потоке. Похоже, что автоматическая настройка вида, которая должна влиять на верхний контроллер, влияет на средний.
Это верно? И если да, что мне делать, поскольку я хочу, чтобы все восстановление состояния происходило сразу после запуска приложения?
РЕДАКТИРОВАТЬ: похоже, мне было неясно. restoreNextViewController:
- это метод подкласса MyViewController, который восстанавливает состояние контроллера на основе сохраненного ключа, а затем отправляет соответствующий дочерний контроллер с помощью [self.navigationController pushViewController:foo animated:NO]
. Я делаю это потому, что мое реальное приложение, в отличие от этого упрощенного случая, имеет в стеке до 6 контроллеров, и они не всегда одинаковы. Так что я подумал, что это будет более чистый дизайн, чем спускаться по классам контроллеров стека. Каждый контроллер уже знает, как нажать дочерний контроллер в ответ на пользовательский ввод; почему бы не использовать это при перезапуске приложения?
У меня нет проблем с отображением контроллеров; они просто странно выкладываются.