Supponiamo che la navigazione di seguito sia ViewController -> FirstViewController -> SecondViewController.C'è uno svolgimento da SecondViewController
a ViewController
. È possibile aggiungere all'intermediario FirstViewController
il seguente codice per rilevare le azioni di svolgimento.
import UIKit
class FirstViewController: UIViewController {
var unwindAction:Bool = false
override func viewDidAppear(animated: Bool) {
if unwindAction {
println("Unwind action")
unwindAction = false
}
}
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
self.unwindAction = true
return super.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
}
}
EDIT Dopo aver dato questo qualche pensiero, ho deciso la soluzione a questo dipende dal tipo di complessità che si sta trattando qui. Che cosa fai esattamente quando segui i successivi? Le soluzioni fornite qui sono valide e funzionano - solo se si desidera rilevare se si tratta di un'azione di svolgimento. Cosa succede se si desidera passare i dati tra il punto in cui lo svolgimento si svolge alla radice? E se ci fosse un insieme complesso di preparativi che vuoi fare in uno dei controller di visualizzazione intermedi? E se volessi fare entrambe queste cose?
In tali scenari complessi, escluderei immediatamente l'override dei metodi di svolgimento del controller di visualizzazione. Facendo queste operazioni, funzionerà, ma non sarà pulito. Un metodo farà ciò che non dovrebbe fare. L'hai sentito? Questo è odore di codice.
Cosa succede se, in qualche modo, un controller di visualizzazione può informare il controller di visualizzazione successivo nella gerarchia dell'evento che si verifica? Meglio ancora, come lo facciamo senza accoppiare strettamente questi due?
Protocollo.
avere una definizione qualcosa di protocollo come:
protocol UnwindResponding {
prepareForUnwindSegue(segue:UISegue , formViewController:UIViewController, withImportantInfo info:[String,AnyObject])
}
Utilizzando il protocollo si può mantenere la relazione tra gli oggetti - la gerarchia dei controller di vista, in questo caso - esplicita. Al momento dell'occorrenza di un particolare evento, delegherete la chiamata al successivo controller nella gerarchia che informa sull'evento di un particolare evento in un altro controller di vista. Ecco un esempio:
override func prepareForSegue(segue:UIStoryboardSegue, sender:AnyObject?) {
if let unwindResponder = self.presentingViewController as? UnwindResponding where segue.identifier = "unwindSegue" {
unwindResponder.prepareForUnwindSegue(segue:UISegue, fromViewController:self,info:info)
}
}
Nel controller della vista intermediario si può fare qualcosa di simile:
extension IntermediaryViewController : UnwindResponding {
prepareForUnwindSegue(segue:UISegue , fromViewController:UIViewController, withImportantInfo info:[String,AnyObject]) {
if let unwindResponder = self.presentingViewController {
unwindResponder.prepareForUnwindSegue(segue,fromViewController:fromViewController, info:info)
}
unwindSegue = true
}
}
Certo, non si vuole fare questo se si vuole solo rilevare segues di svolgimento. Forse lo fai, non saprai mai cosa succederà in futuro. Non fa mai male a mantenere pulito il tuo codice. Metodo
che arriviamo a. – TIMEX
Ottiene 'viewWillAppear:' e 'viewDidAppear:'. – matt
Ma come faccio a sapere che è stato da una pausa invece di qualcos'altro? – TIMEX