2011-01-10 17 views
7

Sto usando un UISplitViewController all'interno di un UITabBarController con una pianura UIViewController nel riquadro padrone di visualizzare le due parti e un UINavigationController nel riquadro dettagli, che a sua volta contiene una vaniglia UIViewController.metodi delegato UISplitViewController non chiamati

Sono consapevole del fatto che Apple consiglia di utilizzare le viste divise solo a livello di root, tuttavia ho visto altre applicazioni (ad esempio la scheda di Amazon- 'Wish List') che utilizzano viste divise in schede quindi sono sicuro che sia possibile .

Il mio problema è che i metodi delegati della vista divisa, vale a dire. quelli in UISplitViewControllerDelegate non vengono richiamati, il che impedisce di creare il mio menu popup quando si passa alla modalità verticale.

I metodi in questione sono i seguenti -

// 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; 

Il UISplitViewControllerfa ricevere le notifiche di rotazione.

posso ottenere il metodo willShowViewController di essere chiamato se forzo la barra di stato l'orientamento a destra del paesaggio (o sinistra) all'inizio del lancio app, utilizzando

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

Tuttavia, i willHideViewController doesn essere chiamato E non voglio forzare l'avvio dell'applicazione in orizzontale. Se faccio la stessa cosa ma la costringo a ritratto, non ricevo le callback.

Non capisco perché il controllore della vista divisa non stia chiamando i suoi metodi delegati quando si comporta diversamente. Tali metodi dovrebbero essere chiamati dalla method-

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

internamente, e quando breakpoint all'interno di questa, è possibile verificare che il delegato è impostato e che è ancora vivo.

Sono rimasto bloccato su questo tutto il giorno! Tutto il resto funziona alla grande e sono molto contento che la combinazione splitview/tabbar/navbar funzioni bene. Ho solo bisogno di queste notifiche.

Devo forse chiamarli manualmente quando ruoto? Sembra molto sbagliato quando il `UISplitViewController 'dovrebbe fare questo.

risposta

4

Risolto, deve essere a livello di root o una sottoview diretta di un tabBar che deve anche essere al livello di root. Fastidioso!

+0

Ciao, ti dispiacerebbe elaborare ulteriormente la tua soluzione? Ho lo stesso problema in questo momento. Ho ottenuto 1 tabcontroller che ha una splitview in 3 schede. Ho aggiunto la view detail in ogni splitview a un proprio controllore di navigazione sottoclassato che delega la splitview. Funziona perfettamente per la scheda attualmente visibile ma non per gli altri. Quindi quando ruoto la mia vista e cambio la scheda sembra tutto incasinato, finché non lo ruoto. Di nuovo, quindi solo per la vista visibile. –

+0

hmm scusate non ne sono sicuro .. Sono sicuro di aver visto un post qui da qualche parte che indicava che il passaggio tra le schede di splitview e la rotazione causava problemi e che lo splitviwe dovrebbe sempre essere a livello di finestra - nemmeno sotto un controller di schede. Che è supportato dai documenti che immagino. In realtà sto prendendo il percorso di costruire il mio SplitView da zero in quanto richiede divisioni orizzontali – Sam

+1

Invece di provare da zero, prova questo - http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad – Viraj

3

Innanzitutto, provare a impostare i delegati corretti. esempio, diciamo che si è creato tre controller,

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

È stato implementato il protocollo delegato alla vista di dettaglio, in modo che quando cambia l'orientamento, vista di dettaglio dovrebbe essere in grado di mettere un pulsante nella barra degli strumenti.

Ora che splitView chiama questa funzione da delegato, è necessario impostare il delegato stesso.

Così da qualche parte, se vi manca la seguente chiamata,

splitView.delegate = detailView; 

detailview la volontà di non ricevere la notifica dei cambiamenti di orientamento, ecc Almeno questo è dove sono rimasto bloccato.

L'altra opzione è quella di guardare il link sottostante. Ha anche un codice completamente funzionante, anche se dopo averlo esaminato un po ', potrebbe essere un po' più di quello che serve per far funzionare le cose, ma poi hey .. è un codice che sta già funzionando, quindi dovresti farti andare veloce .

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

2

mi piace il seguente metodo di invio di un messaggio dal master UIViewController al dettaglio UIViewController. Da qualche parte dentro implementazione del maestro:

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

Questo è da Fall di Paul Hegarty 2011 Stanford iTunesU iPad e iPhone Application Development corso.

+0

Mi piace molto la tua idea perché è un pensiero fuori dagli schemi . –

Problemi correlati