nella mia app ci sono due ViewController, ViewController e ViewControler2
nel ViewController, un gruppo di pulsanti Present Modally segue to "ViewController2"
e il ViewController sovrascrive la vista
override func viewWillAppear(_ animated: Bool) { super.viewDidAppear(animated) print("will appear") }
in ViewControler2, un pulsante per tornare indietro
@IBAction func close(_ sender: Any) { self.dismiss(animated: true, completion: nil) }
ora è ancora possibile attivare viewWillAppero poi torno al ViewController da ViewController2
se cambio la presentazione di ViewControler2 da Full Screen
a Over Current Context
, viewWillAppear
non verrà attivata
come posso attivare qualche codice quando torno?
En title : How to trigger some code when back from "Over Current Content" ViewController?
ci sono diversi modi per gestire questa operazione. ecco uno, che ho usato per usare.
è inoltre possibile utilizzare, il proprio metodo per ricaricare vista / viewcontroller, ma
viewWillAppear
è un metodo comune accessibile per tutti i controller di vista (come parte del ciclo di vita super classe) quindi potrebbe non essere necessario specificare il tipo personalizzato di controller di vista perpresentingVC
modo migliore / pulito per gestire questo scenario per utilizzare il gestore di richiamo.
codice di esempio
si può fare senza rinunciare a segues storyboard, ma è comunque dovuto impostare volontà / ha Disappear handler in ViewCOntrolller2:
if segue.destination is ViewController2 {
(segue.destination as! ViewController2).onViewWillDisappear = {
var onViewWillDisappear: ((_ backVal:Int)->())?
,onViewWillDisappear?(1)
, Come leggere il valore in qui?(segue.destination as! ViewController2).onViewWillDisappear = {}
.onViewWillDisappear = { myVariable in ... }
alternativamente si può usare il parametro implicito$0
:.onViewWillDisappear = { print($0) }
mentre le risposte finora fornite funzionano penso che sia una buona idea per mostrare come farlo utilizzando un protocollo e delegato in quanto questa è una implementazione pulita che poi permette anche per ulteriori funzionalità da aggiungere con il minimo sforzo.
quindi impostare un protocollo come questo:
impostare il secondo controller di visualizzazione in questo modo:
impostare il primo controller di visualizzazione in questo modo:
implementarlo in questo modo fa quello che la richiesta originale era e permette che i metodi supplementari siano messi nel protocollo in modo che il FirstViewController possa rispondere ad altre azioni nel SecondViewController.
nota: nota:
si potrebbe voler spostare la chiamata metodo delegato nella chiusura del gestore di esclusione in modo da sapere che il metodo non è chiamato fino a quando il SecondViewController è effettivamente andato (nel caso in cui si tenta di presentare un'altra vista che potrebbe fallire). se questo è il caso si potrebbe fare questo:
in realtà si potrebbe avere una volontà e fatto metodi e li chiamano così:
il che vi permetterà di fare qualcosa immediatamente, mentre il secondo controller si sta animando e poi sapere quando è effettivamente andato.
protocol SecondViewControllerProtocol: class {
nel nuovo file swift o nel file ViewController?