2014-08-31 13 views
7

Sono nuovo alla programmazione & Swift e sto cercando di capire come passare i dati tra due controller di vista (nessun seguito) con protocolli e delegati.Cercando di capire il protocollo/delegati in Swift

Ho un controller di visualizzazione (VISTA A) che ha un campo di testo e un pulsante. Quando l'utente preme quel pulsante, dovrebbe mostrare quel testo in un'etichetta in un altro View Controller (VISTA B).

Non riesco a ottenere l'etichetta per mostrare il testo - Gradirei una spiegazione di ciò che è necessario per fare questo lavoro.

Grazie mille!

import UIKit 

      protocol sendNameToViewB { 

       func showNameLabel(name:String) 
      } 

      class ViewA: UIViewController { 

       var delegate: sendNameToViewB? 

       @IBOutlet weak var textField: UITextField! 

       @IBAction func addButton(sender: AnyObject) { 
        delegate?.showNameLabel(textField.text) 

       } 
       override func viewDidLoad() { 
        super.viewDidLoad() 

        // Do any additional setup after loading the view, typically from a nib. 
       } 
       override func didReceiveMemoryWarning() { 
        super.didReceiveMemoryWarning() 
        // Dispose of any resources that can be recreated. 
       } 


      } 

      class ViewB: UIViewController, sendNameToViewB { 

       @IBOutlet weak var theLabel: UILabel! 

       func showNameLabel(name: String) { 
        theLabel.text = name 
       } 
      } 

VIEW CONTROLLERS

risposta

8

In primo luogo, una nota: I vostri nomi per i controller di vista dovrebbe includere "ViewController" nel nome. Esiste una raccolta di classi completamente diversa che eredita da UIView. Denominare un View Controller appena ViewA fa sembrare che la tua classe sia solo una vista invece che un controller di visualizzazione. Le viste sono in un livello completamente diverso della tua applicazione.

Ora, per passare i dati a un altro oggetto, il primo requisito è quello di avere un riferimento tra di loro. Questo riferimento può essere impostato in entrambe le direzioni.

Una possibilità è avere ViewControllerA mantenere un riferimento a ViewControllerB. Tramite questo riferimento, ViewControllerA può chiamare un metodo su ViewControllerB quando viene premuto il pulsante che accetta i dati che si desidera passare come argomento.

class ViewControllerA: UIViewController { 
    @IBOutlet weak var viewControllerB: ViewControllerB! 

    @IBAction func addButton(sender: AnyObject) { 
     self.viewControllerB.showNameLabel(textField.text) 
    } 
} 

L'altra possibilità è quella di utilizzare uno schema delegato come suggerisce il titolo. Ciò comporterebbe che ViewControllerB avesse un riferimento a ViewControllerA. Preferibilmente, questo non sarebbe con la conoscenza diretta della classe ViewControllerA, ma piuttosto attraverso un protocollo. Il protocollo definirà un metodo che restituisce i dati che si desidera "passare" a ViewControllerB. In questo modo, ViewContollerB può chiamare il metodo del protocollo sul suo "delegato" (che potrebbe essere ViewControllerA) per ottenere i dati necessari.

protocol ViewControllerBDelegate { 
    func requiredText() -> String 
} 

class ViewControllerB: UIViewController { 
    @IBOutlet weak var delegate: ViewControllerBDelegate? 

    override func viewDidLoad() { 
     if let actualDelegate = self.delegate { 
      self.theLabel.text = actualDelegate.requiredText() 
     } 
    } 
} 

Quale metodo si sceglie in realtà dipende da ciò che è necessario in questa circostanza. Lo schema dei delegati è preferibile per mantenere i vostri oggetti meno accoppiati, ma se avete già bisogno di "triggerare" cose su ViewControllerB da ViewControllerA, probabilmente è necessario il metodo più diretto.

+0

Grazie per il vostro aiuto @drewag! –

+1

Il metodo "diretto" non creerebbe una nuova istanza di ViewControllerB? Inoltre, ho dovuto usare 'var tabbarViewController: TabBarViewController = TabBarViewController()' invece come il modo in cui hai messo non ha funzionato (variabile rimasta nil) –

+0

@ByronCoetsee e OP, hai tutte le risorse andando più in profondità su quale metodo seguire? Quando è necessario l'accoppiamento? ecc. Grazie! –

Problemi correlati