2015-07-08 38 views
5

Ho tre controller di visualizzazione (VC1, controllore vista padre e controller vista bambino). Come posso passare i dati dal VC1 al controller di visualizzazione figlio quando viene caricato il ParentVC? Normalmente avrei poter utilizzare questo nel primo controller VistaPassare i dati da View Controller a Controller bambino in Swift

var text = "Hello" 
var sVC = SecondViewController() 
sVC.string = text 

e sarebbe passare Hello alla variabile string nel secondo controller della vista. e poi fare la stessa cosa per passare i dati dal secondo controller di visualizzazione al terzo. Ma sfortunatamente, questa logica non funziona. Ho provato a passare i dati da VC1 a ParentVC poi a ChildVC. Ho anche provato a passare i dati da VC1 direttamente a ChildVC ma non sembra funzionare neanche.

Ecco quello che ho

import UIKit 
class ViewController1: UIViewController { 

var a = "Test" 

override func viewDidLoad() { 
    var pVC = ParentViewController() 
    pVC.a = a 
    } 
} 

Sono in grado di passare i dati alla Capogruppo View Controller e stampe Test ma non è così per il Bambino View Controller

import UIKit 

class ParentViewController: UIViewController { 

var pageMenu: CAPSPageMenu? 
var a = "" 

func test() { 

    var cvC = ChildViewController(frame: self.view.frame) 
    cvC.a = a 
} 

override func viewDidLoad() { 
    println(a) 

} 

override func viewWillAppear(animated: Bool) { 

} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // MARK: - Scroll menu setup 

    // Initialize view controllers to display and place in array 
    var controllerArray : [UIViewController] = [] 

    var controller1 : ChildViewController = ChildViewController(nibName: nil, bundle: nil) 
    controller1.title = "View Controller" 
    controllerArray.append(controller1) 

    // Initialize scroll menu 
    pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, 65, self.view.frame.width, self.view.frame.height), pageMenuOptions: parameters) 

    self.view.addSubview(pageMenu!.view) 

    } 
} 

E in il controller Child View che ho:

import UIKit 

class ChildViewController: UIViewController { 

var a = "" 

convenience init(frame:CGRect){ 
    self.init(nibName: nil, bundle: nil) 
    self.view.frame = frame 

} 

override func viewDidLoad() { 
    var pVC = ParentViewController() 
    pVC.test() 
    println(a) 
} 
+0

Che cosa significa 'cvC' nel codice? – Leo

+0

Dovrebbe essere una variabile. Lo modifico –

+0

Si stanno creando nuovi controllori ogni volta.'ChildViewController' crea un nuovo' ParentViewController' quando la vista è caricata e 'ParentViewController' crea nuovamente' ChildViewController' nel metodo 'test' e' viewDidAppear' di nuovo, ma si passa solo la proprietà 'a' nel metodo' test' , che non fa nulla con il controller figlio. – redent84

risposta

4

Quando si carica il ParentViewController dal tuo ViewController, non ci sono viste caricate in memoria. È solo un'istanza della tua classe ParentViewController.

override func viewDidLoad() { 
    var pVC = ParentViewController() 
    pVC.a = a 
} 

E suppongo che tu stia caricando o presentando questo controller da qualche altra parte nel tuo codice. Se è così, ha senso che tu stia stampando con successo la variabile che si sta impostando.

println (a) -> "Test"

Tuttavia, quando si istanziare la vostra ChildViewController, si sta fornendo una cornice per la sua convenience init e in realtà si sta avviando la gerarchia vista, che a sua volta spara l'evento viewDidLoad. Questo viene eseguito prima che la variabile a sia impostata da ParentViewController -> ViewDidLoad. E il risultato della stampa della variabile a è in realtà una stringa vuota.

Un'opzione è mettere la logica all'interno delle proprie funzioni che chiamate esplicitamente. Facoltativamente con i tuoi dati come parametri o imposta le variabili prima di chiamare le funzioni.

Si consiglia di controllare alcuni di questi per ottenere una migliore comprensione di come funzionano le cose e percorsi che è possibile seguire per realizzare ciò che si desidera.

Instantiate and Present a viewController in Swift

UIViewController class reference

How can I passing data from parent view controller to child view controller?

Spero che questo aiuti!

+0

Ho provato a metterlo in una funzione chiamata esplicitamente dal VC figlio, ma questo non ha funzionato. Ho aggiornato il codice. Eventuali suggerimenti? –

+0

Non era esattamente quello che avevo in mente. Facci sapere se intendi utilizzare lo storyboard quando imposti queste visualizzazioni o vengono create in modo programmatico? – Laffen