2010-09-23 12 views
8

Il Apple documentation fornisce il seguente avviso relativo all'utilizzo dei controller di visualizzazione per gestire parte di una schermata.In che modo Apple rende i controller contenenti altri controller?

Nota: Si consiglia di non utilizzare la visualizzazione controller per gestire le viste che riempiono solo una parte della loro finestra, cioè solo una parte della zona definita dal contenuto rettangolo di applicazione. Se vuoi che desideri avere un'interfaccia composta da diverse visualizzazioni più piccole, incorpora tutte le in una singola vista principale e gestisci quella vista con il tuo controller di visualizzazione.

Ora la cosa strana è che Apple rompe questo consiglio. UITabBarController, UINavigationController, UISplitViewController tutti vanno contro questo consiglio. C'è una discussione sullo Apple forums su cosa può andare storto se ignori questo consiglio.

Ho trovato un tutorial su come eseguire questa operazione, ma il metodo ha riscontrato un problema con overlapping the status bar che aveva una correzione che sembrava un po 'dubbia. Altre domande hanno solutions that appear kind of dodgy o advise against doing it.

Quindi data la domanda è quale metodo utilizza Apple per i propri controller?

+0

Potete per favore pubblicare il link al riferimento? Creo sempre un viewController per le piccole viste nonostante riempiano o non riempiano lo schermo. Vorrei verificare le conseguenze e le buone pratiche, per favore pubblica il link. . . –

+0

@Raj: Ho aggiunto un collegamento nella parte superiore della mia domanda – Casebash

risposta

4

Si dice anche di non utilizzare i pool di autorelease, ma ci sono le dichiarazioni autorelease tra i loro campioni. Rimani con ciò che è pratico. La purezza dovrebbe probabilmente essere leggermente secondaria.

3

Apple ha scritto UIKit, così possono fare quello che vogliono.

C'è un sacco di roba sta accadendo sotto il cofano:

  • vista {Will, Did} {apparire, Disappear}
  • Vista rotazioni (ugh, mal di testa)
  • UIViewControllerWrapperView, che a volte è la genitore di UIViewController.view. O qualcosa.
  • UIViewController.navigationController/tabBarController/parentViewController/modalViewController
  • I popover sono strani. Non sono sicuro di come si inseriscono in.

Se scrivete i vostri punti di vista, probabilmente si può ottenere via con l'utilizzo di UIViewController di controllarli , ma non mi aspetto tutto il comportamento magico che dà a UIKit un controller di visualizzazione "corretto".

MODIFICA: Probabilmente non dovrei StackOverflow quando è tardi. Intendo davvero qualcosa del genere:

Se una vista è controllata da un UIViewController, il controller di visualizzazione dovrebbe esistere nella gerarchia del controller di visualizzazione (ad esempio funzioni come presentModalViewController:animated:). Ciò consente a UIKit di gestire i bit complicati.

Quando si utilizza qualcosa come [fooSubview addSubview:viewController.view], UIKit non può fare tutte le cose che dovrebbe fare. Cosa conserva viewController? Cosa succede se c'è un avviso di memoria e fooSubview viene scaricato?

Se si imposta qualcosa come viewController.view.frame = (CGRect){{0,0},{320,480}}, si sta anche cercando un problema: UIViewController imposta la cornice in base allo stato corrente/navigazione/tabulazione/barra.Potrebbe re-impostarlo, o potrebbe usare il frame per decidere come disporre i controller di vista che si premono sopra (ho notato questo comportamento, è disordinato). Se si modifica viewController.view.transform, possono verificarsi strane cose nelle rotazioni della vista, poiché la trasformazione della vista è ciò che UIViewController utilizza per l'orientamento (insieme alla barra di stato e una pila di altre cose).

C'è una sola eccezione ben supportato io conosca:

[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

(In realtà, si può attaccare viewController.view all'interno di una visualizzazione a finestra all'interno della finestra, io non sono sicuro di come funziona .)

Penso che in OS 4.0+ si supponga di impostare window.rootViewController = viewController invece.

+0

I controller Apple funzionano con qualsiasi vista – Casebash

Problemi correlati