ho intenzione di andare avanti e non essere d'accordo con @ St3fan, e utilizzare UIKit
come contro-esempio.
Tuttavia, la saggezza (o la sua mancanza) dei controller di incorporamento in generale dovrebbe essere guidata da sani principi di progettazione dell'interfaccia utente.
Il metodo più semplice contro-esempio è UINavigationControllers
incorporato in UITabBarControllers
. Questi appaiono dappertutto. Appena in cima alla mia testa, l'app iPod su iPhone e i Contatti all'interno dell'app Telefono su iPhone.
Ero abbastanza curioso di preoccuparmi di controllare cosa fanno con le viste (aggiungere alla vista "super-controller" o allo UIWindow
. Ero abbastanza sicuro che stavo andando a scoprire che le vedute del sottocontrollo erano discendenti delle viste del super controller nella gerarchia della vista, che è contrario alla raccomandazione di St3fan.
Ho montato un'app per iPhone molto veloce collegando tutto in InterfaceBuilder per creare un'applicazione basata su UITabBarController
con due schede, la prima delle quali era a UINavigationController
con un semplice UIViewController
come controller di visualizzazione radice e una seconda scheda con un semplice vecchio UIViewController
solo così ho avuto una seconda scheda per fare clic più tardi.
Sprinkle in alcuni NSLog
dichiarazioni uscita vari UIView's
per i controllori vediamo questo:
tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ...
navigationController.view = <UILayoutContainerView: 0x59469a0; ...
rootViewController.view = <UIView: 0x594bb70; ...
Superview: <UIViewControllerWrapperView: 0x594cc90; ...
Superview: <UINavigationTransitionView: 0x594a420; ...
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view
Superview: <UIViewControllerWrapperView: 0x594b430; ...
Superview: <UITransitionView: 0x5b0e110; ...
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view
Superview: <UIWindow: 0x5942a30; ...
Le linee prefisso "Superview" erano l'output risalendo la catena rootViewController.view's
superview fino a colpire nullo.
Quindi, ovviamente, una rapida occhiata allo stack di chiamate in un paio di punti in cui viewDidDisappear
veniva chiamato sul controller della vista radice.
Innanzitutto, lo stack di chiamata quando viewDidDisappear
viene chiamato nel controller principale come risultato di un nuovo controller di essere spinto nello stack:
-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...
secondo luogo, lo stack di chiamata quando un'altra scheda viene selezionata nella più in alto UITabBarController:
-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
Quindi, in tutti i casi, sembra che Apple ha deciso che i titolari dovrebbero essere chiamando i vari viewDidAppear
, ecc metodi sui loro sub-console incorporati e che della vista devono essere incorporati simile LY. Penso che l'OP abbia colpito proprio questo chiodo sulla testa se vogliamo prendere il design UIKit
come un buon esempio da seguire.
solo perché sono curioso ...: perché dovresti avvolgere un controller barra di registro in un altro viewcontroller? :) nella maggior parte dei casi, sono la radice della gerarchia vista (controller) ... – Toastor
+1 .. risolto davvero il mio problema .. applausi –