2009-05-01 14 views
7

Sembra che tutti i modelli Cocoa Touch siano impostati per caricare un pennino.Caricamento di un controller di visualizzazione e visualizzazione della gerarchia in modo programmatico in Cocoa Touch senza xib

Se voglio avviare un nuovo progetto che utilizzerà un controller di visualizzazione e carica la sua vista (gerarchia) in modo programmatico, non da un pennino/xib, quali sono i passaggi per impostarlo o modificarlo.

Penso che tutto quello che dovevo fare era implementare -loadView, ma ho problemi ogni volta che provo a farlo.

+0

Sì, dovresti essere in grado di fare ciò che stai cercando di fare inizializzando e aggiungendo la tua vista e sottoviewview all'interno di loadView. Cura di pubblicare il tuo codice? –

+0

Posso cestinare il pennino e impostare il plist Pennino principale su zero? Quando faccio questo, si rompe, perché il AppDelegate prefabbricato è impostato per caricare la finestra principale e visualizzare i pennini del controller. –

risposta

16

E 'abbastanza semplice da fare generazione un'interfaccia utente completamente programmatica. In primo luogo, è necessario modificare main.m a guardare qualcosa di simile al seguente:

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

dove MyAppDelegate è il nome della vostra classe di applicazione delegato. Ciò significa che verrà creata un'istanza di MyAppDelegate all'avvio, che viene normalmente gestita dal file Nib principale per l'applicazione.

All'interno MyAppDelegate, implementare l'applicationDidFinishLaunching: metodo simile al seguente:

- (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];  
} 

dove MyRootViewController è il controller della vista per la vista primaria nella finestra. Questo dovrebbe inizializzare la finestra principale e aggiungere la vista gestita da MyRootViewController. rootController viene mantenuto come variabile di istanza all'interno del delegato, per riferimento futuro.

Questo dovrebbe consentire di generare in modo programmatico l'interfaccia utente tramite MyRootViewController.

+0

@Brad Larson, grazie amico, è super utile! –

3

Gli stessi UIViews non hanno una gerarchia, fanno UINavigationControllers. Quindi avvia uno di questi e aggiungi un UIViewController al suo stack. Questo dovrebbe farlo, nel modo più semplice possibile, senza alcun file XIB. Dovresti essere in grado di costruire su questo.

- (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

In realtà, le visualizzazioni utente mantengono una gerarchia per il layout sullo schermo, ma non dello stesso tipo di gerarchia a cui stai pensando per quanto riguarda la navigazione. –

+0

Abbastanza vero. Non pensavo che fosse quello che stava chiedendo, ma hai assolutamente ragione. – mmc

Problemi correlati