2015-05-16 24 views
6

Ho un genitore UIViewController, che apre un bambino UIViewController:chiamare un metodo genitore UIViewController da un bambino UIViewController

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! UIViewController 
self.presentViewController(vc, animated: true, completion: nil) 

si preme un pulsante nella ChildView che dovrebbe chiudere il il ChildView e chiamare un metodo nel Parent View:

self.dismissViewControllerAnimated(true, completion: nil) 
CALL PARENTS METHOD ?????? 

Come fare? Ho trovato una buona risposta (Link to good answer), ma non sono sicuro che questa sia la procedura migliore con UIViewControllers. Qualcuno può aiutare?

+0

Il modello di delega nel collegamento è il modo corretto per farlo e funziona perfettamente quando si utilizza ViewControllers. L'unica volta che non funziona è quando si utilizzano Segues, ma anche in questo caso si tratta di due o tre righe di codice in più per farlo funzionare. Vedi il titolo della sezione "Aggiunta di prepareForSegue" qui: http://makeapppie.com/2014/07/01/swift-swift-using-segues-and-delegates-in-navigation-controllers-part-1-the-template/ – chedabob

+0

Puoi controllare la mia risposta –

+0

Il modo più semplice è disponibile all'indirizzo: http://stackoverflow.com/a/28476319/1953178 –

risposta

12

Un modo semplice per raggiungere questo obiettivo è può usare NSNotificationCenter per quello.

Nel vostro ParentViewController aggiungere questo in viewDidLoad metodo:

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshList:", name:"refresh", object: nil) 
} 

Dopo di che aggiungere questa funzione in ParentViewController che andranno chiamato quando si elimina la tua ChildViewController:

func refreshList(notification: NSNotification){ 

    println("parent method is called") 
} 

e nella vostra ChildViewController aggiungere questo codice in cui è stata ignorata la visualizzazione secondaria:

@IBAction func btnPressed(sender: AnyObject) { 

    NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: nil) 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

Ora, quando si chiude la visualizzazione figlio, verrà chiamato il metodo refreshList.

1

Qualcosa che ho notato nella tua domanda: non chiamare un metodo (il metodo genitore nel tuo caso) dopo aver chiuso il controller della vista. L'eliminazione del controller della vista causerà la deallocazione. I comandi successivi potrebbero non essere eseguiti.

Il link che hai incluso nella domanda indica una buona risposta. Nel tuo caso, userei la delega. Chiamare il metodo di delega nel controller di visualizzazione padre prima di chiudere il controller di visualizzazione figlio.

Ecco un eccellente tutorial.

+0

Grazie per l'aiuto. Ho cercato di implementare la soluzione nel link corretto, ma sto affrontando un problema. Con UIViewController non posso impostare il delegato (child.delegate = self). Voglio dire che non posso: vc.delegate = self. –

+0

Ciao, dovrebbe funzionare. Che messaggio di errore ricevi? – vomako

+0

'UIViewController' non ha un membro chiamato 'delegate' –

2

aggiunge una proprietà debole per il controller della vista del bambino che dovrebbe contenere un riferimento al controller della vista genitore

class ChildViewController: UIViewController { 
weak var parentViewController: UIViewController? 
.... 
} 

Poi nel codice (sto supponendo che è all'interno del vostro controller della vista genitore),

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! ChildViewController 
vc.parentViewController = self 
self.presentViewController(vc, animated: true, completion: nil) 

E, come ha detto vomako, chiamare il metodo del genitore prima di chiudere il controller di visualizzazione figlio.

parentViewController.someMethod() 
self.dismissViewControllerAnimated(true, completion: nil) 

In alternativa, è possibile anche chiamare il metodo nel Parametro completamento della dismissViewControllerAnimated, dove verrà eseguito dopo si Bambini regolatore respinge:

self.dismissViewControllerAnimated(true) { 
    parentViewController.someMethod() 
} 
+0

Grazie per l'aiuto: teoricamente questo sembra buono, ma ho praticamente problemi :-). Ho ricevuto l'errore: impossibile assegnare a 'parentViewController' in vc. Secondo: –

+0

Hai lanciato il controller di visualizzazione come UIViewController o come una sottolonna di UIViewController come UIViewController? Devi sottoclassi se vuoi avere le tue proprietà aggiuntive. lascia vc = storyboard.instantiateViewControllerWithIdentifier ("myChildView") come! ** ** ChildViewController – chrisamanse

1
protocol SampleProtocol 
{ 
    func someMethod() 
} 


class parentViewController: SampleProtocol 
{ 
    // Conforming to SampleProtocol 
    func someMethod() { 
    } 
} 

class ChildViewController 
    { 
     var delegate:SampleProtocol? 
    } 

    self.dismissViewControllerAnimated(true, completion: nil) 
    delegate?.someMethod() 
Problemi correlati