2016-08-02 58 views
4

Im folgenden Code habe ich eine ViewController ("SenderViewController"), die eine Nachricht an die Haupt ViewController leitet, wenn eine Schaltfläche angetippt wird. Was ich nicht vollständig verstehe ist, wie messageData() Methode in der Haupt ViewController wissen, wann auf die Nachricht zu hören.Wie Daten zwischen UIViewControllern mit Protokollen/Delegaten übergeben werden

Kann mir bitte jemand erklären, was die messageData() Methode in der Haupt ViewController auslöst?

SenderViewController:

import UIKit 
protocol SenderViewControllerDelegate { 
    func messageData(data: AnyObject) 
} 
class SenderViewController: UIViewController { 
    @IBOutlet weak var inputMessage: UITextField! 
    var delegate: SenderViewControllerDelegate? 

    @IBAction func sendData(sender: AnyObject) { 
     / 
     if inputMessage.text != ""{ 
      self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 
      self.delegate?.messageData(inputMessage.text!) 
     } 
    } 
} 

Hauptviewcontroller:

import UIKit 
class ViewController: UIViewController, SenderViewControllerDelegate{ 
    @IBOutlet weak var showData: UILabel! 

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

    @IBAction func goToView(sender: AnyObject) { 
     let pvc = storyboard?.instantiateViewControllerWithIdentifier("senderViewController") as! SenderViewController 
     pvc.delegate = self 
     self.presentViewController(pvc, animated:true, completion:nil) 
    } 

    // What triggers this method, how it know when to listen? 
    func messageData(data: AnyObject) { 
     self.showData.text = "\(data)" 
    } 
} 

Vielen Dank!

+1

Dieser Aufruf 'selb.delegate? .messageData' von' func sendData' in 'SenderViewController' führt ihn aus. – iphonic

+1

Folgen Sie dieser Anleitung, Sie erhalten Ihre Antwort - http://www.tutorialspoint.com/ios/ios_delegates.htm –

+0

Weitergabe von Daten mit Delegate Swift 4.0: https://iosdevcenters.blogspot.com/2017/11/what- is-protocol-how-to-pop-daten-using.html – Bhadresh

Antwort

2

Objekte hören nicht genau nach Methodenaufrufen. Sie sitzen dort und warten darauf, angerufen zu werden.

Die Linie

self.delegate?.messageData(inputMessage.text!) 

Von Ihrem SenderViewController ist ein Funktionsaufruf. (Der Begriff Methode und Funktion ist ziemlich austauschbar, obwohl die method normalerweise für die Funktionen von Objekten verwendet wird.) Sie ruft die Funktion messageData in ViewController auf.

+0

Verstanden, vielen Dank. –

3

Während Sie SenderViewController von MainViewController präsentieren, setzen Sie den Delegaten auf self. Also, wenn Sie die delegierte Methode in SenderViewController rufen

self.delegate?.messageData(inputMessage.text!) 

folgende Methode von MainViewController als Rückruf

func messageData(data: AnyObject) { 
     self.showData.text = "\(data)" 
    } 
+0

Vielen Dank für Ihre Eingabe. –

3

In SenderViewController handeln:

Wenn Sie tippen Sie sendData Methode aufrufen. In dieser Methode fragen Sie delegate, um seine messageData Methode aufzurufen. Delegate-Eigenschaft als SenderViewControllerDelegate Typ deklariert, so dass Sie das tun können (siehe dieses Protokoll Verteidigung).

In ViewController (ersten View-Controller):

Bevor Sie zweite View-Controller öffnen, in Methode goToView Sie Eigenschaft seting delegate von SenderViewController zu 'mir', um genau zu Instanz von ViewController, da Sie erklärten, dass sie bestätigen Protokoll SenderViewControllerDelegate durch Implementieren der Methode messageData. So wird ViewController jetzt als delegate Eigenschaft in SenderViewController gespeichert und kann verwendet werden, um messageData aufzurufen!

+0

Sinn machen, vielen Dank. –

2
self.delegate?.messageData(inputMessage.text!)