2011-04-30 15 views
9

A través de esta pregunta, me gustaría saber si entiendo bien la noción de Root View Controller.Programación iOS: aclaraciones sobre Root View Controller

En la aplicación para iOS, el Root View Controller (RVC) es el controlador cuya vista se agrega a la aplicación UIWindow al inicio, ¿no es cierto?

[window addSubview:rvcController.View]; 
[window makeKeyAndVisible]; 

Ahora, una ventana UI también tiene una propiedad rootViewController. Al ejecutar el fragmento de código anterior, ¿esa propiedad se llena con el rvcController o tengo que configurarlo de forma explícita?

Luego, en un UINavigationController es posible establecer un RVC que sea diferente del conjunto de RVC anterior para el punto de entrada.

En este caso, la primera vez que agrego un controlador a la pila navigationController (presionando un nuevo controlador sobre él), ¿el marco establece ese controlador como el RVC para el navigationController o tengo que configurarlo explícitamente a través del initWithRootViewController ¿método?

Respuesta

20

Ya ... cuando comencé el desarrollo de iPhone ... la cosa de rootViewController también me lanzó a un bucle. Pero es realmente sencillo.

cuando se inicia la aplicación, creo un objeto UIWindow en mi clase de delegado de aplicaciones. Además, en esa clase, tengo una propiedad de tipo UIWindow llamada window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    self.window=w; 
    [w release]; 
    // other code here... 
} 

entonces creo un UIViewController cuya view será el primer punto de vista de la jerarquía de la ventana, esto podría ser llamado el "controlador de vista raíz".

La parte confusa es ...que a menudo creamos un UINavigationController como el "controlador de vista raíz" y que el controlador de navegación tiene un método init que solicita un "RootViewController", que es el primer controlador de vista que colocará en su pila.

Por lo tanto, la ventana obtiene un "controlador de vista raíz", que es el UINavigationController, que también tiene un RootViewController, que es el primer controlador de visualización que desea mostrar.

una vez que resolver eso, todo tiene sentido .. creo :-)

Aquí hay un código que lo hace todo .. (tomado de un proyecto que tengo abierto delante de mí)

//called with the app first loads and runs.. does not fire on restarts while that app was in memory 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    //create the base window.. an ios thing 
    UIWindow *w = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    self.window=w; 
    [w release]; 

    // this is the home page from the user's perspective 
    //the UINavController wraps around the MainViewController, or better said, the MainViewController is the root view controller 
    MainViewController *vc = [[MainViewController alloc]init]; 

    UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:vc]; 
    self.navigationController=nc; // I have a property on the app delegate that references the root view controller, which is my navigation controller. 

    [nc release]; 
    [vc release]; 

    //show them 
    [self.window addSubview:nc.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

Pero esto no configura window.rootViewController, ¿o sí? – nmr

+0

la propiedad "relativamente nueva" window.rootViewController (a partir de 4.0) la agrega a la jerarquía de ventanas y contiene una referencia al controlador de vista raíz de Windows. –

+0

Bien, entonces, no veo que se establezca, el VC se agrega a través de '[self.window addSubview: nc.view];', por lo que este ejemplo lo dejaría sin configurar, ¿verdad? – nmr

8

Ahora, una ventana UI también tiene una propiedad rootViewController. Al ejecutar el fragmento de código anterior, ¿esa propiedad se rellena con el rvcController o tengo que configurarlo explícitamente?

usted tiene que establecer explícitamente, y si lo hace, puede quitar la línea addSubview, porque eso lo maneja de forma automática cuando se configura un controlador de vista raíz.

Luego, en un UINavigationController es posible configurar un RVC que sea diferente del RVC anterior establecido para el punto de entrada.

Por supuesto, el controlador de vista raíz de un controlador de navegación no tiene nada que ver con el de la ventana.

En este caso, la primera vez que agregue un controlador de la pila navigationController (empujando un nuevo controlador en él), sí establece el marco que el controlador como el VCR para la navigationController o tengo que configurarlo de forma explícita a través del método initWithRootViewController?

initWithRootViewController es solo un atajo para inicializar un controlador de navegación vacío y empujar el primer controlador de vista (raíz) a la pila. Tenga en cuenta que rootViewController no es una propiedad de UINavigationController, que accedería a través de [navController.viewControllers objectAtIndex:0].

+0

Gracias por su responde omz. ¿Qué quiere decir con _Debe configurarlo explícitamente, y si lo hace, puede eliminar la línea addSubview, porque eso se maneja automáticamente cuando establece un controlador de vista raíz._? –

+0

Luego, dijiste que 'initWithRootViewController' es un método abreviado. ¡De acuerdo! Así que cree un navigationController con este método o cree uno nuevo y presione un controlador sobre él, es lo mismo, ¿No es cierto? ¿Ambos procedimientos crean un controlador de vista raíz que no puedo eliminar? –

+0

¡Muchas gracias por su colaboración! –

0
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 

    ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 

self.window.rootViewController= viewcontroller; 




[self.window makeKeyAndVisible]; 
return YES; 

}

1

en primer lugar, se puede crear un proyecto vacío en Xcode. después de agregar el nuevo archivo en el controlador de vista de clase objetivoc con xiv. ahora se puede añadir a este código en appdeligate.m y establecer el RootViewController en appdeligate

NOTA: - importación ViewController.h a la appdeligate.m

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 

    ViewController *viewcontroller =[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 

self.window.rootViewController= viewcontroller; 




[self.window makeKeyAndVisible]; 
return YES; 

}

Cuestiones relacionadas