6

In un'applicazione basata su una barra delle linguette, se ho un controller inserito nello stack di navigazione da una scheda e poi, quando un'altra scheda è attiva, provo a far scattare il controller, non viene rilasciato a meno che non lo mostri senza animazione .UIKit non rilascia il controller se non viene rimosso con l'animazione?

Questo funziona:

[navigationController popToRootViewControllerAnimated:NO]; 

E questo non lo fa:

[navigationController popToRootViewControllerAnimated:YES]; 

Qualcuno ha qualche idea di cosa sta succedendo qui? Il parametro animated non viene utilizzato correttamente?

UPDATE:

di Apple mi ha informato che questo è davvero un bug in UIKit, e hanno segnato qualcuno come urgente e ad essa assegnati. Potrebbe essere stato risolto nelle ultime versioni ma non ho avuto il tempo di controllare.

+1

Sembra un errore in UIKit. Se puoi confermarlo con un semplice progetto, invialo ad Apple. –

+0

Ho appena creato un progetto di esempio per confermarlo, e posso farlo. Ovviamente non è qualcosa che accade con * ogni * uso di UINavigationController. Succede se si ha un UITabBarController con un controller di navigazione all'interno di una scheda e da un'altra scheda si apre il controller di navigazione. Quello che ho notato è che, se si dispone di più di 1 controller di visualizzazione nello stack, vengono rilasciati tutti tranne l'ultimo, che rimane conservato fino a quando non si seleziona di nuovo l'altra scheda (quella con il controller di navigazione). – eugeniodepalo

+1

Se per "ultimo" controller si intende il controller di root, allora questo è pertinente: "Se il controller di visualizzazione in cima allo stack è il controller di visualizzazione radice, questo metodo non fa nulla ... non puoi inserire l'ultimo elemento su lo stack. " (Dalla documentazione di 'popViewControllerAnimated:'.) Molto raramente devi preoccuparti quando UIKit rilascia oggetti. Assicurati di fare la tua parte della gestione della memoria. Chissà, forse le strutture si aggrappano a un oggetto per riciclarlo in seguito? O forse no. Il punto è che puoi fare affidamento su di loro per essere ben collaudati. – Felixyz

risposta

0

ciò che Dshutsi suggerisce è giusto. Se si desidera rimuovere le notifiche, è meglio chiamare il metodo viewDidUnload del controller. Questo metodo viene chiamato quando il controller viene scaricato dallo stack. Sto solo citando questo perché non possiamo votare il commento come risposta.

+0

Nella documentazione è scritto che viewDidUnload è chiamato solo in condizioni di memoria insufficiente. Immagino che questo non sia il caso. Anche se questa non è la risposta che stavo cercando (il controller * dovrebbe * essere rilasciato), lo accetterò poiché è l'unica soluzione funzionante oltre a passare SÌ al parametro animato! Grazie. – eugeniodepalo

0

Se il problema principale sono le notifiche osservate, perché non rimuovere gli osservatori nel "- (void) viewWillDisappear: (BOOL) animato" - metodo?

+0

Perché desidero ancora ricevere la notifica se il controller è nascosto (ad esempio, l'utente seleziona un'altra scheda). Penso che viewWillDisappear: viene chiamato ogni volta che il controller non viene visualizzato sul display, non è vero? – eugeniodepalo

+0

Si potrebbe provare il metodo viewDidUnload che dovrebbe essere chiamato quando la vista viene rilasciata dal suo controller. Dai un'occhiata alla documentazione su: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36 – Dshutsi

Problemi correlati