View Controllers: ¿Cómo cambiar entre vistas mediante programación?
n resumen: quiero tener dos vistas de pantalla completa, donde puedo cambiar entre la vista A y la vista B. Sé que podría usar un controlador de barra de pestañas, pero no quiero. Quiero ver cómo se hace esto a mano, para saber qué sucede debajo del capó.
Tengo un UIViewController que actúa como un controlador raíz:
@interface MyRootController : UIViewController {
IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;
@end
El contentView está conectado a una UIView que agregué como una subvista a la "vista" del Nib. Esto tiene color verde y lo veo a pantalla completa. Funciona bien
Luego, creé otros dos controladores de vista de la misma manera. ViewControllerA y ViewControllerB. ViewControllerA tiene un fondo azul, ViewControllerB tiene un fondo negro. Solo para ver cuál está activo.
Entonces, en la implementación de myRootController, hago esto:
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
ViewControllerA *vcA = [[ViewControllerA alloc] initWithNib];
[self.contentView addSubview:vcA.view];
[cvA release];
}
Por cierto, el método -initWithNib se ve así:
- (id)initWithNib { // Load the view nib
if (self = [super initWithNibName:@"ViewA" bundle:nil]) {
// do ivar initialization here, if needed
}
return self;
}
Eso funciona. Veo la vista de ViewControllerA cuando inicio la aplicación. Pero ahora la gran pregunta es: un controlador de vista normalmente tiene todos esos métodos como:
(vacío) viewWillAppear: (BOOL) animado; (vacío) viewDidDisappear: (BOOL) animado; (vacío) viewDidLoad;...y así. ¿Quién o qué, o cómo se llamarían esos métodos si lo hago "a mi manera" sin un controlador de barra de pestañas? Quiero decir: si asigno esa clase de ViewController y la vista se hace visible, ¿debería tener cuidado de llamar a esos métodos? ¿Cómo sabe que viewWillAppear, viewDidDisappear o viewDidLoad? Creo que el Tab Bar Controller tiene toda esta "inteligencia" debajo del capó. ¿O me equivoco?
ACTUALIZACIÓN: lo he probado. Si libero el controlador de vista (por ejemplo: ViewControllerA), no recibiré ningún mensaje de registro en viewDidDisappear. Solo al asignar e inicializar ViewControllerA, obtengo un viewDidLoad. Pero eso es todo. Entonces, todas las señales representan la inteligencia de UITabBarController ahora;) y tengo que descubrir cómo replicar eso, ¿verdad?