wake-up-neo.com

UISplitViewController: Wie zwingt man beim Popup-Start die Popover-Darstellung? (Porträt)

In einer iPad-App verwende ich den UISplitViewController. Ich muss die Anzeige des Master-Popovers erzwingen, wenn die App im Hochformat gestartet wird.

Jetzt verwende ich diesen Code und er funktioniert gut unter iOS 5.0. 

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
   if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) {
      [[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]];
   }            
}

In iOS 5.1 (mit dem neuen Master-Popover-Typ) scheint das Verhalten jedoch zufällig zu sein. Manchmal erscheint der Popover im Vollbildmodus und funktioniert manchmal gut.

Ein Vorschlag für 5.1?

25
alejandromp

Ich hatte eine Zeitlang mit diesem Problem zu kämpfen, und selbst jetzt bin ich nicht zu 100% mit der Lösung zufrieden, aber es ist das Einzige, was ich angesichts der derzeitigen Einschränkungen aufstellen konnte.

Überschreiben Sie zunächst die folgende Delegatmethode:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController

und verwenden Sie es, um einen Verweis auf das Element der Balkenschaltfläche zu erfassen und in einer iVar zu speichern:

barButtonForMaster = barButtonItem;

Wenn Sie dann den Master-View-Controller anzeigen möchten, führen Sie einen Anruf wie folgt aus:

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];

Wenn Sie dies gleich beim Start ausführen möchten, verwenden Sie eine gewisse Verzögerung, um das Abstürzen der App zu verhindern (dank des hilfreichen Kommentars):

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];

In diesem Fall können Sie den Selektor rechts in der Delegate-Methode der geteilten Ansicht ausführen.

13
Rob Elkin

Kein Vorschlag hier für 5.1, aber einen für 8.0:

Mit iOS8 gibt es jetzt eine Reihe neuer Methoden für die UISplitViewController-Konfiguration.

In Ihrem Fall hat Juste den richtigen Wert in preferredDisplayMode gesetzt, zum Beispiel im masterViewController viewDidLoad.

Ziel c:

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

    //....
}

Swift:

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

Aber es ist natürlich nur iOS8.

26
Martin

In Anbetracht der Antwort von Rob funktioniert dies gut für mich (im Detailbildschirm 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];
}

Es ist nicht erforderlich, eine separate Referenz abzurufen. Verwenden Sie stattdessen self.navigationItem.leftBarButtonItem

13
Setomidor

Für iOS8 ist der einfachste Weg der folgende:

 self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;

Ich verwende dies, wenn die App zum ersten Mal gestartet wird, um das Login in masterViewController anzuzeigen. In allen anderen Fällen, die ich verwende 

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic
7
aquarius68

Wenn Sie es beim Start der App benötigen, überschreiben Sie diese Methode in Ihrem Detailansicht-Controller:

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

Wenn Sie es jedoch später zum Ausblenden benötigen, sieht es so aus, als ob die Methode nicht aufgerufen wird. Daher müssen Sie sie manuell ausblenden.

5
SeanR

Eine etwas weniger hackige Variante (Swift):

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

Ich verwende diese Lösung:
Setzen Sie in splitViewController in viewDidLoad displayMode auf .primaryOverlay

override func viewDidLoad() {
    if self.isCollapsed == false, self.displayMode == .primaryHidden {
        self.preferredDisplayMode = .primaryOverlay
    }
}

Und in viewWillAppear wieder auf .automatic setzen

override func viewWillAppear(_ animated: Bool) {
    self.preferredDisplayMode = .automatic
}

Auf diese Weise wird die Masteransicht beim Start von UISplitViewController angezeigt und hat das Standardverhalten, nachdem sich die Ausrichtung geändert hat.

1

Es ist nicht nötig, dumme Verweise auf das barButtonItem zu führen. Rufen Sie einfach dasselbe Ziel/dieselbe Aktion auf. Siehe meine Antwort https://stackoverflow.com/a/25695923/1021430

Das Ziel ist der Split-View-Controller. Die Aktion ist toggleMasterVisible:

0
user1021430