2013-12-18 17 views
6

Con iOS 6 Apple ha ripristinato lo stato su UIViewController e le classi correlate. Ciò consente all'applicazione di salvare lo stato una volta terminata e ripristinarla quando l'utente riprende l'applicazione.Ripristino stato UIViewController - relazioni deboli

Tutto sembra funzionare correttamente, tuttavia ho raggiunto uno scenario strano che non si adatta allo schema.

Supponiamo di avere due controller di vista, ViewControllerOne e ViewControllerTwo, entrambi memorizzano alcuni stati arbitrari che vengono ripristinati correttamente. Ora immaginiamo che ViewControllerOne abbia una proprietà delegate e che sia ViewControllerTwo delegato (che è un modello comune per i controller di visualizzazione modale). Chi è responsabile del ripristino di questa relazione? E come dovrebbe essere conservato/ripristinato?

Nel mio caso particolare non sono coinvolti storyboard, il ripristino avviene in codice, tramite la proprietà restorationClass. Il mio primo istinto è stato quello di provare a ripristinare la relazione mentre creavo il controller della vista in restorationClass, tuttavia poiché lo restorationClass non ha idea di altri controller esistenti, non è in grado di ripristinare tale relazione.

In alternativa, se è il controller di visualizzazione che dichiara la proprietà delegate, che si suppone ripristini la relazione, come si esegue ora dell'istanza del controller che è stata ripristinata in qualche altra classe?

In breve, questo sembra uno scenario scarsamente documentato e speravo che qualcuno potesse far luce su di esso.

risposta

2

Direi che l'attività ricade sul controller della vista delegata per impostarsi come tale, proprio come si fa prima di premere l'altro controller della vista.

Su come è possibile ottenere questo, ci sono diverse opzioni.

È possibile memorizzare un riferimento debole ai controller di visualizzazione in una posizione accessibile a livello globale (ad esempio, delegato dell'app) e utilizzare questi valori in application:didDecodeRestorableStateWithCoder: per impostare la delega: questo è il metodo utilizzato nell'API.

In alternativa, è possibile inviare una notifica "hereIAmThisIsMe" (con self parte delle informazioni utente) dal controller della vista superiore a cui il delegato ascolta e imposta se stesso come delegato.

+0

Anche se questo è sicuramente un modo plausibile di fare le cose, non sei d'accordo che non è il più elegante? Mi sembra che la prima soluzione proposta rompa un po 'l'incapsulamento (AppDelegate diventa questo "conosci tutto", non qualcosa che vuoi)? Il secondo è un approccio un po 'più interessante, dove spediresti questa notifica, nel decodeRestorableStateWithCoder :? –

+0

L'invio è un'opzione, ma è necessario preoccuparsi della temporizzazione - quale controller viene ripristinato per primo. –

+1

@HenriNormak BTW, il primo metodo non interrompe necessariamente l'incapsulamento. Potresti implementare un protocollo, chiamiamolo 'PostRestorationHandler', dove c'è un metodo' didFinishRestoration', e abbiamo il delegato del controller della vista che imposta la delega lì. AppDelegate conosce solo l'esistenza se i controller della vista (e quelli relativi all'app delegato), ma non tocca gli interni. –

Problemi correlati