2011-03-09 13 views
49

he notado una gran cantidad de ejemplos de aplicaciones para el iPhone en la Solicitud Delegadoself.window.rootViewController vs addSubview ventana

- (void)applicationDidFinishLaunching:(UIApplication *)application

tener

[window addSubview: someController.view]; (1)

en contraposición a

self.window.rootViewController = self.someController; (2)

¿Hay alguna razón práctica para usar una sobre la otra? ¿Es uno técnicamente correcto? No controlador a echar un comando equivalente al número (2) como

self.someController.rootController = self.someOtherController; // pseudocode

Respuesta

48

La propiedad UIWindowrootViewController es nuevo con iOS4.

La técnica anterior era usar addSubview.

La nueva técnica recomendada es establecer rootViewController.

+7

¿Cuáles son algunas de las razones por las que se recomienda configurar rootViewController sobre addSubview? – pepsi

+1

@ pepsi Puedo decirte que tiene mucho más sentido en iOS 5.0, está bajo NDA así que no podemos discutirlo aquí, pregunta en los foros de desarrollo y lo obtendrás, tiene que ver con la contención del controlador de vista. – Zebs

+1

un beneficio discutible es que, como propiedad, puede establecerlo en IB en lugar de escribir código para realizar la asociación. – TomSwift

-1

El bloqueo se debe a que está llamando a un método que no existe, no porque las variables no se hayan inicializado.

-setRootViewController no existe antes de iOS 4.0. Utilice

[self.window addSubview:self.tabBarController.view]; en su lugar.

O bien, actualice su plataforma de destino a 4.0.2 o posterior. Probablemente sea menos del 5% de los usuarios que no estén usando iOS 4 en este momento.

5

utilizo este código:

rootViewController_ = [[RootViewController alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    window_ = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    if ([window_ respondsToSelector:@selector(setRootViewController:)]) { // >= ios4.0 
     [window_ setRootViewController:rootViewController_]; 
    } else { // < ios4.0 
     [window_ addSubview:rootViewController_.view]; 
    } 
1

Mi opinión:

self.window.rootViewController adaptará la rootViewController.view según la altura de la barra de estado

Pero si utiliza addSubview no lo hará

Por ejemplo, si estableceRootViewController en NavigationController, navigationCont el rodillo sería (0,0,320,480);

pero si estableceRootViewController a un UIViewController común, el navigationController sería (0,0,320,460);

si utiliza addSubview: los dos viewcontrollers habría (0,0,320,480)

Y si hay un A-call-barra de estado. también cambiar para cuando utilice setRoot ... si utiliza addSubview, el tamaño subvista no cambiaría

hacer alguna prueba con vista diferente color del borde

+0

sí me ayuda .... –

+0

tiene sentido ...... –

10

Apenas una actualización en esto con la liberación de ios 6.

Si sigue usando el - [UIWindow addsubview:] repetición, probablemente recibirá el mensaje "Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del lanzamiento de la aplicación" en su consola también. Junto con posibles problemas de rotación y problemas de diseño en tu aplicación.

Establecer el rootViewController de la ventana como se indicó anteriormente solucionará esto también.

+0

Sí, mi punto de vista estaba apareciendo en la orientación incorrecta incluso cuando ViewController usó la nueva API de rotación de iOS6 ... ¡hasta que arreglé esto! – mattorb

+0

por el amor de Dios! ¡Tengo este mensaje por semanas y no pude encontrar una solución adecuada hasta ahora que no estaba buscando eso! GRACIAS – SpaceDog

Cuestiones relacionadas