Frage

Ich bin mit einem UISplitViewController in einem UITabBarController mit einem einfachen UIViewController im Masterbereich der geteilten Ansicht und eine UINavigationController im Detailbereich, der selbst eine Vanille UIViewController enthält.

Ich bin mir bewusst, dass Apple beraten zu verwenden geteilte Ansichten auf der Stammebene nur, aber ich habe andere Anwendungen gesehen (zB Amazon- ‚Merkzettel‘ tab), dass die Verwendung geteilte Ansichten in Tabs so ich bin sicher, es ist möglich.

Mein Problem ist, dass die Delegatmethoden der geteilten Ansicht, dh. die in UISplitViewControllerDelegate nicht aufgerufen werden, das verhindert, dass ich von der Erstellung meines Pop-over-Menü, wenn in Portrait-Modus umgeschaltet wird.

Die Methoden in Frage, sind die folgenden -

// Called when a button should be added to a toolbar for a hidden view controller
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc;

// Called when the view is shown again in the split view, invalidating the button and popover controller
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem;

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers.
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController;

Die UISplitViewController nicht erhalten die Rotation Benachrichtigungen.

Ich kann erhalten die willShowViewController Methode aufgerufen werden, wenn ich die Statusleiste Orientierung zwingen Landschaft rechts (oder links) zu Beginn der App zu starten, mit

 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

Allerdings ist die willHideViewController nicht aufgerufen. Und ich will nicht die App zwingen, in der Landschaft zu starten. Wenn ich das gleiche tun, aber es Porträt zwingen, ich die Rückrufe nicht erhalten.

Ich verstehe nicht, warum der Split-View-Controller nicht, dass es ruft Methoden delegieren, wenn es sonst korrekt verhalten wird. Diese Verfahren sollten von ihrer Methode aufgerufen werden -

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

intern, und wenn ich in diesem Haltepunkt kann ich überprüfen, ob die Delegierten festgelegt ist und dass es noch am Leben.

Wurde an diesem ganzen Tag stecken! Alles andere funktioniert großartig und ich bin sehr erfreut, dass die SPLITVIEW- / Tabbar / navbar Kombination gut funktioniert. Ich brauche nur diese Benachrichtigungen.

Soll ich sie vielleicht nur manuell aufrufen, wenn ich drehen? Scheint sehr falsch, wenn der `UISplitViewController‘ dies zu tun sein sollte.

War es hilfreich?

Lösung

Gelöst hat es auf beide Root-Ebene oder eine direkte subview eines tabBar sein, die auch auf Root-Ebene sein muss. Nervig!

Andere Tipps

Versuchen Sie zuerst, um zu sehen, ob Sie die richtig Delegierten setzen. zum Beispiel können Sie sagen drei Controller erstellt,

UISplitViewController* splitView;
UIViewController* masterView;
UIViewController* detailView;

Sie implementiert das Delegate-Protokoll auf der Detailansicht, so dass, wenn Ausrichtung ändert, Detailansicht Lage sein sollte, eine Schaltfläche in der Symbolleiste zu setzen.

Um nun für SPLITVIEW- diese Funktion aufzurufen aus delegieren, müssen Sie den Delegierten selbst setzen.

Also irgendwo, wenn Sie den folgenden Aufruf fehlen,

splitView.delegate = detailView;

Detailansicht der wird nie von der Orientierung benachrichtigt, Änderungen usw. Zumindest das ist, wo ich stecken geblieben war.

I wie das folgende Verfahren zur Herstellung eine Nachricht von dem Master UIViewController zum Detail UIViewController senden. Irgendwo in der Umsetzung des Master:

id detailViewController = [[self.splitViewController viewControllers] lastObject];
[detailViewController setSomeProperty:…];

Dies ist von Paul Hegarty Herbst 2011 Stanford iTunesU iPad und iPhone Application Development Kurs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top