7

Ho un'app che utilizza due UINavigationControllers: uno per il sistema di menu e uno per il gioco effettivo. Un UINavigationController comune è dichiarato nella mia appDelegate. Quando l'app viene caricata, carica il Menu o l'UINavigationController del gioco. E ovviamente il giocatore può quindi navigare tra i due.Juggling multiple UINavigationControllers che utilizzano il delegato dell'app e garantiscono UINavigationController correttamente dealloc

Quando si passa dal menu al gioco, creo un nuovo UINavigationController e la presenta come segue:

GameViewController *rootController = [[GameViewController alloc] init]; 
    UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
    [rootController release]; 
    newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:newNavController animated:YES]; 
[newNavController release]; 

Tuttavia, ho notato che quando faccio questo, viewController del menu non chiama mai dealloc. Presumibilmente perché c'è ancora un riferimento a qualcosa che lo mantiene in vita. Ho scoperto che quando imposto esplicitamente UINavigationController di App Delegate sul nuovo controller di navigazione, (prima di rilasciare il nuovo navController) rilascia il Menu. Lo faccio come segue:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

È questa buona pratica? Ho scoperto che quando si naviga dal gioco al menu, tuttavia, lo stesso trucco non sembra funzionare. Cioè

MainMenuViewController *menuViewController = [[MainMenuViewController alloc] init]; 
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:menuViewController]; 
[menuViewController release]; 
newNavController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:newNavController animated:YES]; 

//Setting the appDelegate's navController to the new navController allows the menu to dealloc. 
//This must happen AFTER the newNavController has been loaded. 
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

non chiamare dealloc sul ViewController principale del gioco. E quando torno di nuovo al gioco, il ViewController principale del menu non viene più rilasciato.

Mi manca qualcosa durante la giocoleria di UINavigationControllers?

Grazie,

Michael

EDIT: allora ho capito che la ragione principale ViewController del mio gioco non è stato deallocing, era perché mi ha alcuni NSTimers che non avevo invalidato! Tuttavia, sono ancora curioso di sapere se il mio approccio sopra è corretto, e che ridefinire esplicitamente il navController nel Delegato app è il modo corretto per consentire ai diversi UINavigationControllers di dealloc :)

+0

Sono perplesso da alcune cose: 1) Se la tua app è un gioco, perché dovresti voler deallocare il controller di visualizzazione del gioco? 2) Come corollario, perché stai presentando il controller di gioco in modo modale? 3) Qual è il controller di visualizzazione che stai utilizzando per presentare i controller di gioco e di menu (ad esempio, qual è la classe di "self" nel tuo codice di esempio e quale ruolo svolge tale oggetto nella tua app)? – jlehr

+0

1. Beh, è ​​un gioco piuttosto semplice, e l'utente può spostarsi avanti e indietro tra menu e gioco, quindi ho pensato che sarebbe stato utile scaricare il gioco quando entrano nel menu. 2. Non so in che altro modo presentare il controller di gioco per farlo girare bene. Potrei aggiungerlo come una sottoview della finestra, ma poi cambia improvvisamente e mi piace la transizione. Questa cattiva pratica? 3) Il self nel mio codice è rootViewController dell'attuale UINavigationController. È così male: o – Smikey

risposta

8

Rendetevi la vita più facile. Utilizzare un singolo UINavigationController e mantenere due stack di View Controller separati, che sono solo matrici di UIViewControllers. Puoi usare [UINavigationController setViewControllers:animated:] per scambiare semplicemente gli stack e lasciare il controller di navigazione in posizione. Utilizzare UINavigationController.viewControllers per mantenere lo stack corrente su cui tenere premuto prima di sostituirlo. È qualcosa come 14,3 miliardi di volte più facile e più pulito che affrontare tutti i capricci di più controller di navigazione.

+1

Dove devo fare lo switch - nel delegato dell'app? – Smikey

Problemi correlati