2009-05-01 21 views
7

Parece que todas las plantillas de Cocoa Touch están configuradas para cargar una plumilla.Cargando una vista Controlador y jerarquía de vista programáticamente en Cocoa Touch sin xib

Si quiero comenzar un nuevo proyecto que va a usar un controlador de vista, y cargar su vista (jerarquía) programáticamente, no desde un nib/xib, ¿cuáles son los pasos para configurarlo o ajustar una plantilla?

Pensé que todo lo que tenía que hacer era implementar -loadView, pero tengo problemas cada vez que trato de hacer esto.

+0

Sí, debería poder hacer lo que está intentando hacer inicializando y agregando su vista y subvistas dentro de loadView. ¿Te importa publicar tu código? –

+0

¿Puedo trash el plumín y configurar el plist Main nib en nil? Cuando hago esto, se rompe, porque el AppDelegate prefabricado está configurado para cargar la ventana principal y ver las puntas del controlador. –

Respuesta

16

Es razonablemente simple de hacer la generación de interfaz de usuario totalmente programática. En primer lugar, tiene que editar main.m a ser algo como lo siguiente:

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    UIApplicationMain(argc, argv, nil, @"MyAppDelegate"); 
    [pool release]; 
    return 0; 
} 

donde MyAppDelegate es el nombre de la clase de aplicación delegado. Esto significa que se creará una instancia de MyAppDelegate en el inicio, algo que normalmente maneja el archivo Nib principal de la aplicación.

Dentro MyAppDelegate, poner en práctica su applicationDidFinishLaunching: método similar al siguiente:

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{  
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    if (!window) 
    { 
     [self release]; 
     return; 
    } 
    window.backgroundColor = [UIColor whiteColor]; 

    rootController = [[MyRootViewController alloc] init]; 

    [window addSubview:rootController.view]; 
    [window makeKeyAndVisible]; 
    [window layoutSubviews];  
} 

donde MyRootViewController es el controlador de vista para la vista principal en su ventana. Esto debería inicializar la ventana principal y agregar la vista administrada por MyRootViewController a ella. rootController se mantiene como una variable de instancia dentro del delegado, para referencia posterior.

Esto debería permitirle generar programáticamente su interfaz de usuario a través de MyRootViewController.

+0

@radradsonson, gracias, hombre, ¡eso es súper útil! –

3

UIViews mismos no tienen una jerarquía, UINavigationControllers do. Así que inicie uno de esos, y coloque un UIViewController en su pila. Esto debería hacerlo, de la manera más básica posible, sin ningún archivo XIB. Deberías poder construir sobre esto.

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    UINavigationController *navController = [[UINavigationController alloc] init]; 

    UIViewController *viewController = [[UIViewController alloc] init]; 

    // set the properties of viewController here, to make it look like you want 

    [navController pushViewController:viewController animated:NO]; 

    [window addSubview:navController.view]; 

    // Don't forget memory management 
    [navController release]; 
    [viewController release]; 

    [window makeKeyAndVisible]; 
} 
+4

En realidad, UIViews mantiene una jerarquía para el diseño en la pantalla, pero no del mismo tipo de jerarquía en la que piensas en lo que respecta a la navegación. –

+0

Cierto. No pensé que fuera eso lo que preguntaba, pero tiene toda la razón. – mmc

Cuestiones relacionadas