Durante le indagini su una perdita di memoria ho scoperto un problema relativo alla tecnica di chiamata setRootViewController:
all'interno di un blocco di animazione di transizione:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
Se il vecchio controller di visualizzazione (quello che viene sostituito) presenta attualmente un altro controller di visualizzazione, il codice precedente non rimuove la visualizzazione presentata dalla gerarchia della visualizzazione.
Cioè, questa sequenza di operazioni ...
- X diventa Root View Controller
- X presenta Y, in modo che la vista di Y sia sullo schermo
- Usando
transitionWithView:
per rendere Z il nuovo Root View Controller
... sembra OK all'utente, ma lo strumento Debug View Hierarchy rivelerà che la vista di Y è ancora lì dietro la vista di Z, all'interno di un file UITransitionView
. Cioè, dopo i tre passaggi precedenti, la gerarchia di visualizzazione è:
- UIWindow
- UITransitionView
- UIView (vista di Y)
- UIView (vista di Z)
- UITransitionView
Sospetto che questo sia un problema perché, al momento della transizione, la vista di X non fa effettivamente parte della gerarchia della vista.
Se invio dismissViewControllerAnimated:NO
a X immediatamente prima transitionWithView:
, la gerarchia di visualizzazione risultante è:
- UIWindow
- UIView (vista di X)
- UIView (vista di Z)
Se invio dismissViewControllerAnimated:
(SÌ o NO) a X, quindi eseguo la transizione nel completion:
blocco, la gerarchia della vista è corretta. Sfortunatamente, ciò interferisce con l'animazione. Se anima il licenziamento, fa perdere tempo; se non si anima, sembra rotto.
Sto provando altri approcci (ad esempio, creare una nuova classe di controller di visualizzazione del contenitore che funga da controller di visualizzazione di root) ma non ho trovato nulla che funzioni. Aggiornerò questa domanda mentre vado.
L'obiettivo finale è passare direttamente dalla vista presentata a un nuovo controller della vista principale e senza lasciare in giro gerarchie di viste vaganti.