Я реализую универсальное приложение, использующее UISplitViewController
для iOS8 и столкнувшись с непонятной проблемой с UINavigation
и очень ценю ваш опыт.UISplitViewController's detail view push error
Мой проект имеет следующий раскадровке расположение:
На IPad, все работает, как ожидалось. Однако, работая на iPhone, навигация не работает должным образом. Пожалуйста, см. Этот short video, демонстрирующий проблему с навигацией, когда я перемещаюсь из «Подробного экрана 2» обратно к «Экран детали 1».
Я попытался реализовать этот же сценарий в совершенно новом проекте, но я не видел проблемы. Только после переноса в мой существующий проект я вижу это поведение.
UPDATE 1:
Вот мой AppDelegate код:
@interface AppDelegate() <UISplitViewControllerDelegate>
@end
@implementation AppDelegate
-(BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions {
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
splitViewController.delegate = self;
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
return YES;
}
#pragma mark - Split view
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
return YES;
}
....
@end
UPDATE 2:
Благодаря PetahChristian, я думаю, что его замечание ниже верно:
К co llapse контроллер вторичного представления, который имеет контроллер навигации , Apple вставляет дополнительный навигационный контроллер в стек основного контроллера навигационной системы . Итак, для iPhone, где вы видите проблемы, похоже, что есть только одна навигация , но на самом деле есть два.
Предполагая, что наблюдение является правильным, как можно предотвратить включение второго навигационного контроллера на главный навигационный контроллер? Методы UISplitViewControllerDelegate
обрабатывают только процедуру коллапса для контроллера вторичного представления. Прямо связаны с UISplitViewController
. В моем случае контроллер вторичного представления, который должен быть свернут (а именно Detail VC1), маршрутизируется через «« Показать детали (например, «Заменить») «segue из главного контроллера представления и методы UISplitViewControllerDelegate
не выполняются во время этого перехода.
С такой же настройкой в совершенно новом проекте Apple не вставляет дополнительный контроллер навигации в основной контроллер навигации, и я не испытываю этой проблемы в новом проекте.
Большое спасибо.
Я прочитал ваш обновленный вопрос. Контроллер вторичного обзора действительно является контроллером вторичной навигации. Посмотрите на свою раскадровку. Вы можете видеть дополнительный контроллер навигации, а Detail VC1 - его дочерним элементом. Когда splitView сворачивается, вторичный контроллер навигации должен свернуть на основном. Apple действительно вставляет дополнительный контроллер навигации в контроллер основного вида. Вот почему они проверяют на '[secondaryViewController isKindOfClass: [UINavigationController class]] ...' См. Мой ответ для более подробной информации. –
Спасибо ПетахЧристайн. Я абсолютно ценю вашу помощь по этой теме, вы помогли мне больше узнать о UISplitViewControllerDelegate. Я нашел виновника своей проблемы и разместил свой ответ ниже. Еще раз спасибо. –