Подтвердить что ты не робот

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) поведение кажется случайным. Иногда popover отображается в полноэкранном режиме и иногда хорошо работает.

Некоторое предложение для 5.1?

4b9b3361

Ответ 1

Я боролся с этим на некоторое время, и даже сейчас я не на 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];

В этом случае вы можете выполнить селектор справа в режиме делегирования вида split.

Ответ 2

Нет предложения здесь для 5.1, но один для 8.0:

Теперь с iOS8 существует набор новых методов для конфигурации UISplitViewController.

В вашем случае juste установит правильное значение в preferredDisplayMode, например, в masterViewController viewDidLoad.

Objective-C:

- (void)viewDidLoad {
    // configuring splitviewcontroller
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;

    //....
}

Swift:

    override func viewDidLoad() {
        self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
    }

Но это, конечно, только iOS8.

Ответ 3

Распространяясь на ответ Роба, это хорошо работает для меня (в окне 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 вместо

Ответ 4

Для iOS8 самый простой способ:

 self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;

Я использую это, когда приложение запускается в первый раз для регистрации входа в masterViewController. Во всех остальных случаях я использую

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic

Ответ 5

Если это необходимо при запуске приложения, переопределите этот метод в контроллере подробного представления:

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
    return NO;
}

Однако, если вам понадобится, чтобы впоследствии скрыть это выглядит так, как будто метод не вызывается, поэтому вам придется вручную скрыть его.

Ответ 6

Немного менее взломанный вариант (быстрый):

let btn = self.splitViewController!.displayModeButtonItem()
btn.target?.performSelector(btn.action, withObject: btn)

Ответ 7

Я использую это решение:
В 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 и будет иметь поведение по умолчанию после изменения ориентации.

Ответ 8

Не нужно оставлять глупые ссылки на barButtonItem. Просто назовите ту же цель/действие. См. Мой ответ fooobar.com/info/148238/...

Цель - это контроллер разделенного вида, а действие - toggleMasterVisible: