2011-01-10 8 views
7
genannt

Ich verwende einen UISplitViewController Inneren eines UITabBarController mit einem einfachen UIViewController im Master-Fenster des Split-Ansicht und einer UINavigationController im Detailbereich, der sich UIViewController Vanille enthält.UISplitViewController Delegatmethoden nicht

Ich bin mir bewusst, dass Apple geteilte Ansichten nur auf der Stammebene empfehlen, aber ich habe andere Anwendungen gesehen (zB Amazon- "Wunschliste" Registerkarte), die geteilte Ansichten in Tabs verwenden, so bin ich mir sicher, dass es möglich ist .

Mein Problem ist, dass die Delegate Methoden der Split-Ansicht, dh. die in UISplitViewControllerDelegate werden nicht aufgerufen, was verhindert, dass ich mein Pop-over-Menü erstelle, wenn ich in den Portrait-Modus wechsle.

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 UISplitViewControllertut die Rotation Benachrichtigungen zu erhalten.

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

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

jedoch der willHideViewController doesn werde nicht angerufen. Und ich möchte nicht, dass die App im Querformat startet. Wenn ich dasselbe mache, aber zum Porträt zwinge, erhalte ich die Rückrufe nicht.

Ich verstehe nicht, warum der Split-View-Controller seine Delegate-Methoden nicht aufruft, wenn er sich ansonsten korrekt verhält. Diese Verfahren sollen von ihrem Methoden-

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

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

Den ganzen Tag festgefahren! Alles andere funktioniert gut und ich bin sehr zufrieden, dass die Splitview/Tabbar/Navbar-Kombination gut funktioniert. Ich brauche nur diese Benachrichtigungen.

Sollte ich sie vielleicht nur manuell aufrufen, wenn ich rotiere? Es scheint sehr falsch, wenn der 'UISplitViewController' dies tun sollte.

Antwort

4

Gelöst, muss es entweder auf Root-Ebene oder eine direkte Unteransicht einer tabBar sein, die auch auf Root-Ebene sein muss. Nervig!

+0

Hallo, Würde es Ihnen etwas ausmachen, Ihre Lösung ein wenig weiter zu erarbeiten? Ich habe gerade das gleiche Problem. Ich habe 1 Tabcontroller, der eine Splitview in 3 Tabs hat. Ich fügte die Detailansicht in jeder Splitview zu einem eigenen untergeordneten Navigationscontroller hinzu, der die Splitview delegiert. Dies funktioniert einwandfrei für die aktuell sichtbare Registerkarte, aber nicht für die anderen. Also, wenn ich meine Ansicht rotiere und die Registerkarte ändere, sieht alles durcheinander, bis ich es rotiere. Wieder nur für die sichtbare Sicht. –

+0

hmm Entschuldigung, ich bin mir nicht sicher .. Ich bin sicher, dass ich irgendwo einen Post gesehen habe, der darauf hingewiesen hat, dass das Wechseln zwischen Splitview Tabs und Rotieren Probleme verursacht und dass der Splitviwe immer auf Fensterebene sein sollte - nicht einmal unter einem Registerkarte Controller. Was von den Dokumenten unterstützt wird, denke ich. Ich nehme tatsächlich den Weg der Erstellung meiner eigenen SplitView von Grund auf neu, wie ich horizontale Splits benötigen – Sam

+1

Anstatt von Grund auf neu zu versuchen, versuchen Sie dies - http://mattgemamm.com/2010/07/31/mgsplitviewcontroller-for-ipad – Viraj

3

Versuchen Sie zuerst, zu überprüfen, ob Sie die richtigen Delegaten festlegen. zum Beispiel können Sie sagen drei Controller erstellt,

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

Sie die Delegaten Protokoll in der Detailansicht implementiert, so dass, wenn Orientierungsänderungen sollten Detailansicht der Lage sein, auf eine Schaltfläche in der Symbolleiste zu setzen.

Jetzt, damit splitView diese Funktion von Delegat aufrufen kann, müssen Sie den Delegaten selbst festlegen.

Also irgendwo, wenn Sie den folgenden Aufruf fehlen,

splitView.delegate = detailView; 

Detail ist nie der Orientierungsänderungen benachrichtigt, usw. Zumindest das ist, wo ich stecken geblieben war.

Die andere Möglichkeit ist, den folgenden Link zu sehen. Es hat auch einen komplett funktionierenden Code, obwohl es nach ein wenig Überprüfung ein bisschen mehr ist als das, was Sie brauchen, um die Dinge zum Laufen zu bringen, aber dann ... es ist ein Code, der bereits funktioniert, also sollten Sie schnell gehen .

http://www.noorselijster19.com/2011/03/ios/combine-tabbar-and-splitview/

2

Ich mag die folgende Methode von UIViewController eine Nachricht von den Master-UIViewController zum Detail sendet. 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.

+0

kämpfen Ich mag deine Idee sehr, weil es ein Gedanke außerhalb der Box ist . –