Компоновка оборачивается, когда я нажимаю несколько контроллеров без анимации - PullRequest
3 голосов
/ 27 мая 2009

Таким образом, у меня есть стек из трех 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 контроллеров, и они не всегда одинаковы. Так что я подумал, что это будет более чистый дизайн, чем спускаться по классам контроллеров стека. Каждый контроллер уже знает, как нажать дочерний контроллер в ответ на пользовательский ввод; почему бы не использовать это при перезапуске приложения?

У меня нет проблем с отображением контроллеров; они просто странно выкладываются.

Ответы [ 4 ]

1 голос
/ 07 июня 2009

Рассматривали ли вы, чтобы каждый контроллер представления выдвигал своего потомка во время viewWillAppear:? Я бы просто установил свойство isRestoringState в вашем appDelegate и проверил бы, чтобы во время viewWillAppear:, если оно установлено, запустил восстановление для этого представления, в том числе нажав на любое видимое дочернее представление. Что-то вроде:

- (void)viewWillAppear:(BOOL)animated {
    if ([[UIApplication sharedApplication] isRestoringState]) {
        // restore local state, set myChildController if a child is visible
        if (myChildController) {
            [self.navigationController pushViewController:myChildController animated:NO];
        }
    }
}
0 голосов
/ 27 мая 2009

Я согласен с Робом, я бы посмотрел на реализацию UINavigationController, когда ваше приложение загружено. Затем вы поместите каждый из ваших контроллеров в UINavigtionController в той последовательности, в которой вы хотите, чтобы они были наслоены.

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

Так что, если вы знаете, в какое состояние вы хотите вернуть ваше приложение, вы можете загрузить соответствующий ViewController из серии, который необходимо обработать, и вставить их в NavigationController.

UIViewController *myViewController = [[UIViewController alloc] initWithNibName:@"myView" bundle:nil];
[navigationController pushViewController:myViewController animated:NO];

Затем, если вы хотите «вернуть» обратно в UIViewController, либо пользователь может бесплатно нажать кнопку «Назад» на панели навигации. Или вы можете управлять навигацией с помощью

- (UIViewController *)popViewControllerAnimated:(BOOL)animated

eg [[self navigationController] popViewControllerAnimated:NO];

Вы также можете контролировать, хотите ли вы отображать панель навигации или нет, если вы хотите управлять push / pop самостоятельно. Надеюсь, я объяснил это достаточно хорошо, я недавно сам прошел эту дорогу.

0 голосов
/ 28 мая 2009

В итоге я вручную сбросил вкладку содержимого каждого табличного представления во время viewWillAppear:.

контроллера.
0 голосов
/ 27 мая 2009

Вы можете вызвать pushViewController: animated: несколько раз. Пожалуйста, отправьте код для -restoreNextViewController. Это сбивает с толку, почему этот код так сложен, как он есть. Читали ли вы раздел Руководства по контроллеру представления на Создание Nav Controller ? Они охватывают размещение контроллеров представления в стеке при запуске.

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