Проблема оказалась в том, что я пытался заменить стек контроллера представления до завершения начальной анимации перехода для контроллера Dummy.Это можно предотвратить следующим образом.
Сначала сохраните (возможный) делегат, установите текущий объект в качестве делегата, установите флаг, что анимация выполняется, и нажмите новый контроллер:
self.oldNavigationControllerDelegate = self.waitingController.navigationController.delegate;
self.waitingController.navigationController.delegate = self;
self.isAnimating = YES;
[viewController.navigationController pushViewController: [[DummyViewController alloc] init] animated: YES];
Затем реализуйте методы протокола UIViewControllerDelegate следующим образом:
#pragma mark -
#pragma mark UINavigationControllerDelegate methods
- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (navigationController == self.waitingController.navigationController)
self.isAnimating = YES;
}
- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (navigationController == self.waitingController.navigationController) {
self.isAnimating = NO;
if (self.readyPage != nil)
[self pageIsReady: self.readyPage]; // method to load the ready controller
}
}
После этого всякий раз, когда ваш контент / контроллер / загрузка / все, что готовы, убедитесь, что контроллер навигации больше не анимирует.Если это так, установите флаг, что страница готова.Если это не так, загрузите страницу:
if (self.isAnimating)
self.readyPage = controller;
else
[self pageIsReady: controller];
И, конечно же, осуществите фактическую загрузку нового стека (как обычно):
- (void) pageIsReady: (UIViewController *) page {
// this method should replace the dummy that is spinning there
UINavigationController * thisNavController = self.waitingController.navigationController;
// remove the Dummy and set the new page instead
NSMutableArray * newControllers = [NSMutableArray arrayWithArray: thisNavController.viewControllers];
[newControllers replaceObjectAtIndex: ([thisNavController.viewControllers count] - 1) withObject: page];
thisNavController.viewControllers = [NSArray arrayWithArray: newControllers];
thisNavController.delegate = self.oldNavigationControllerDelegate; // restore the original delegate
// clean up
self.isAnimating = NO;
self.readyPage = nil;
self.waitingController = nil;
self.oldNavigationControllerDelegate = nil;
}
Это делает всех счастливыми: P