UISplitViewController: Как заставить показывать мастер-поповер при запуске приложения? (портрет)
В приложении для iPad я использую UISplitViewController. Мне нужно заставить показывать мастер поповер при запуске приложения в портретном режиме.
Сейчас я использую этот код, и он хорошо работает на iOS 5.0.
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) {
[[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]];
}
}
Но в iOS 5.1 (с новым типом master popover) поведение кажется случайным. Иногда поповер показывает в полноэкранном режиме, а иногда работает хорошо.
Некоторые предложения для 5.1?
8 ответов
Я боролся с этим некоторое время, и даже сейчас я не на 100% доволен решением, но это единственное, что мне удалось придумать, учитывая текущие ограничения.
Сначала переопределите следующий метод делегата:
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
и использовать его, чтобы получить ссылку на элемент панели кнопок и сохранить его в iVar:
barButtonForMaster = barButtonItem;
Затем, когда вы хотите показать основной контроллер вида, сделайте вызов следующим образом:
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];
Если вы хотите выполнить это в самом начале, используйте некоторую задержку, чтобы предотвратить сбой приложения (благодаря полезному комментарию):
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];
В этом случае вы можете выполнить селектор прямо в методе делегата с разделенным видом.
Здесь нет предложений для 5.1, а для 8.0:
Теперь с iOS8, есть куча новых методов для UISplitViewController
конфигурации.
В вашем случае просто установите правильное значение в preferredDisplayMode
например в masterViewController viewDidLoad
,
Objective-C:
- (void)viewDidLoad {
// configuring splitviewcontroller
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
//....
}
Swift:
override func viewDidLoad() {
self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
}
Но это, конечно, только iOS8.
Продолжая ответ Роба, это хорошо работает для меня (в viewDidLoad подробного экрана):
//If in portrait mode, display the master view
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
[self.navigationItem.leftBarButtonItem.target performSelector:self.navigationItem.leftBarButtonItem.action withObject:self.navigationItem];
}
Нет необходимости извлекать отдельную ссылку, используя вместо этого self.navigationItem.leftBarButtonItem
Для iOS8 самый простой способ заключается в следующем:
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
Я использую это, когда приложение запускается впервые для отображения входа в masterViewController. Во всех остальных случаях я использую
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic
Если вам это нужно при запуске приложения, переопределите этот метод в контроллере подробного представления:
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return NO;
}
Однако, если вам понадобится скрыть его, он выглядит так, как если бы метод не вызывался, поэтому вам придется скрыть его вручную.
Немного менее хакерский вариант (быстрый):
let btn = self.splitViewController!.displayModeButtonItem()
btn.target?.performSelector(btn.action, withObject: btn)
Я использую это решение:
В splitViewController в viewDidLoad установите displayMode в.primaryOverlay
override func viewDidLoad() {
if self.isCollapsed == false, self.displayMode == .primaryHidden {
self.preferredDisplayMode = .primaryOverlay
}
}
И в viewWillAppear установите его обратно.automatic
override func viewWillAppear(_ animated: Bool) {
self.preferredDisplayMode = .automatic
}
Таким образом, главный вид будет показан при запуске UISplitViewController и будет иметь поведение по умолчанию после изменения ориентации.
Нет необходимости хранить глупые ссылки на barButtonItem. Просто назовите ту же цель / действие. Смотрите мой ответ /questions/17181353/programmno-pokazat-skryit-glavnoe-predstavlenie-v-uisplitviewcontroller/17181361#17181361
Целью является контроллер разделенного представления, а действие - toggleMasterVisible: