О, чувак, это вызывало у меня головную боль в течение нескольких дней, и я не мог понять, как это сделать. Хуже всего было то, что создание нового проекта Xcode iOS с шаблоном master-detail работало просто отлично. К счастью, в конце концов, этот маленький факт помог мне найти решение.
Я нашел несколько сообщений, которые предполагают, что решение заключается в реализации нового primaryViewControllerForCollapsingSplitViewController:
метода UISplitViewControllerDelegate
. Я пытался это безрезультатно. То, что Apple делает в шаблоне master-detail, который, кажется, работает, реализует новый (глубоко вздохнув, чтобы сказать все это) splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
метод делегата (снова включен UISplitViewControllerDelegate
). Согласно документам , этот метод:
Просит делегата настроить основной контроллер вида и включить дополнительный контроллер вида в свернутый интерфейс.
Обязательно ознакомьтесь с дискуссионной частью этого метода для более подробной информации.
Apple это обрабатывает так:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController
collapseSecondaryViewController:(UIViewController *)secondaryViewController
ontoPrimaryViewController:(UIViewController *)primaryViewController {
if ([secondaryViewController isKindOfClass:[UINavigationController class]]
&& [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]]
&& ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return YES;
} else {
return NO;
}
}
Эта реализация в основном делает следующее:
- Если
secondaryViewController
это то, что мы ожидаем (а UINavigationController
), и оно показывает то, что мы ожидаем (а DetailViewController
- ваш контроллер представления), но не имеет модели ( detailItem
), тогда " Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
"
- В противном случае вернитесь «
NO
чтобы позволить контроллеру разделенного вида попробовать и включить содержимое контроллера вторичного представления в свернутый интерфейс»
Результаты для iPhone в портретной ориентации следующие (начиная с портрета или с поворота на портрет - или, точнее, класса компактных размеров):
- Если ваш взгляд верен
- и есть модель, показать детальный вид контроллера
- но не имеет модели, покажите главный контроллер вида
- Если ваше мнение не верно
- показать главный контроллер вида
Ясно, как грязь.
UISplitViewController
и всегда возвращаюсьYES
из этого метода, затем просто меняю класс разделения представления в раскадровке, так как я всегда хочу показать мастер на iPhone в портретной ориентации. :)