2009-07-02 7 views
7

Esiste un modo per un UIViewController (all'interno di uno stack di navigazione) per rilevare se viene visualizzato perché è stato eseguito un drill-down o un drill-up?UIViewController: rilevamento drill-down e drill-up

In viewWillAppear, i topViewController e visibleViewController di UINavigationController sono già impostati sul nuovo ViewController, sfortunatamente.

+0

Anche io ho lottato con questo. Avevo sperato di creare una classe helper e renderla il mio "stack" UINavigationControllerDelegate, e poi guardando tramite "navigationController: willShowViewController:" ma ci sono due problemi: 1) sembra essere chiamato anche quando non viene premuto (come il tab su quella pila - che sembra sospetto) e 2) questo è chiamato DOPO la viewWillAppear del controller correlato, che causa problemi logici per me poiché ho bisogno di sapere se sono nella stessa pila prima che appaia la vista. Lo sto solo indicando perché questo approccio sembrava elegante, ma era senza uscita. –

risposta

0

Non si può guardare la proprietà viewControllers nel controller di navigazione?

+1

Ho paura, no. Il controller di visualizzazione corrente sarà sempre l'ultimo elemento dell'array. Non è possibile rilevare se questo è accaduto a causa del fatto che è stato spinto o che un altro controllore è scoppiato. :( – Norman

5

È possibile creare sottoclasse UINavigationController e aggiungere una proprietà didPushViewController. Quindi è possibile ignorare pushViewController e popViewController per impostare correttamente la proprietà su true o false rispettivamente.

+0

Sembra buono, pensavo solo che ci fosse un modo più semplice per cui trascuravo. Grazie. – Norman

1

Hai semplicemente bisogno di sapere quali saranno i controller di visualizzazione precedenti e successivi? O hai bisogno di sapere se un controller di visualizzazione è stato scoppiato o premuto? È possibile implementare il seguente metodo, che è definito da UINavigationControllerDelegate:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

Se, tuttavia, si ha bisogno di sapere se un particolare controller di vista è stato spuntato o spinta, quindi il suggerimento Matt Ponti è la strada da percorrere.

2

Un altro modo è quello di svuotare tutti i controller di visualizzazione che si stanno eseguendo come variabili locali di classe - quindi in viewWillAppear, si sa di essere stato colpito a causa di un drill-up se una delle variabili locali della classe è ancora impostata. Si sa anche da quale controller è tornato l'utente, quindi è possibile fare una logica diversa (come il recupero dei valori modificati dai controller della vista su cui è stato eseguito il drill down).

Non dimenticare di rilasciare e cancellare i riferimenti in viewWillAppear in modo che il sistema venga ripristinato per riconoscere nuovamente le cose correttamente.

Mi piace questo meccanismo più che avere i controller di drill down noti sulla vista principale come un delegato per estrapolare le modifiche, poiché spesso stanno lavorando su una piccola porzione di dati separata e non dovrebbero sapere di una controller dell'intero master view. Li rende più facili da riutilizzare poiché possono essere richiamati da molte classi diverse.