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.
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 :? –
L'invio è un'opzione, ma è necessario preoccuparsi della temporizzazione - quale controller viene ripristinato per primo. –
@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. –