2014-08-27 8 views
13

Vor ein paar Wochen fragte ich this Frage und bekam eine sehr detaillierte Erklärung. Jetzt möchte ich Daten an den ersten ViewController zurückgeben, aber ich bleibe mit der gleichen Methode stecken. Ich habe ein Modal von der ersten VC zur zweiten, wo ich ein Array von Strings bearbeiten möchte, die auf der ersten View wieder angezeigt werden. Also bei meiner ersten Ansicht habe ich eine Reihe von Daten, die an die zweite übergeben werden soll, so dass Editierfelder die aktuellen Informationen anzeigen, nach denen der Benutzer in der Lage sein muss, den Inhalt des Arrays zu bearbeiten und diese Daten an die erste Stelle zurückzuleiten Es wird auf Etiketten angezeigt. Ich benutze Swift.Daten von View-Controllern übergeben Xcode

Mein Code:

(in ViewController.swift :)

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
     let secondVC = segue.destinationViewController as SecondViewController 
     secondVC.namesPlayers = self.namesPlayers 
    } 

(in SecondViewController.swift :)

override func viewDidLoad() { 
    super.viewDidLoad() 
    labelFirstPlayer.text = namenSpelers[0] 
} 

Danke

+0

Wo ist Ihr Code? – Raptor

+0

Entschuldigung, ich habe mein OP aktualisiert –

Antwort

36

Sie müssen verwenden delegieren. Hier ist ein Beispiel wie man einen Delegaten in Swift benutzt.

An Ihrem ersten Viewcontroller, stellen Sie Ihren Delegaten, wenn Sie die zweite VC laden:

Zum Beispiel, wenn Sie den Storyboard-Editor verwenden:

var secondViewController = (segue.destinationViewController.visibleViewController as MySecondViewControllerClass) 
secondViewController.delegate = self 

ein Protokoll schreiben und eine func definieren zu schreiben Sie schätzt

Zum Beispiel zurück, eine Datei namens „Protocol.swift“ erstellen und so etwas schreiben:

protocol writeValueBackDelegate { 
    func writeValueBack(value: String) 
} 

Fügen Sie die Funktion zu Ihrem FirstViewController

func writeValueBack(value: String) { 
    // Or any other function you need to transport data 
} 

Und Ihre ViewControllerClass

class ViewController: UIViewController, writeValueBackDelegate 

Die obige Zeile wird nicht funktionieren, wenn Sie alle Methoden in ViewController nicht umgesetzt haben, die Sie in Ihrem Protokoll definiert Datei.

Zum zweiten View-Controller, und fügen Sie den Delegierten hier:

class SecondViewController: ViewController { 

    // Delegate for FirstViewController 
    // Declare as weak to avoid memory cycles 
    weak var delegate: writeValueBackDelegate? 
} 

Auf dem zweiten View-Controller können Sie nun diese verwenden, um die func im ersten View-Controller eine Passdaten zu nennen.

delegate?.writeValueBack("That is a value") 
+0

Sie müssen auch angeben, dass Ihr erster View-Controller das Protokoll implementiert: 'class ViewController: UIViewController, writeValueBackDelegate {' – vacawama

+0

Danke, habe das vergessen. Ich bearbeite meinen Thread – derdida

+0

Können wir hier keine Verschlüsse verwenden, um dasselbe zu erreichen? – Satyam

0

Ich bin durch die Antwort verwirrt Delegierten verwenden, weil es unnötig kompliziert zu mir scheint. Hier ist, was ich getan habe, um einen Player hinzufügen-Dialog in meinem Kartenspiel zu öffnen und die Ergebnisse zurück an den Anruf-View-Controller zu übergeben.

Add Delegat-Protokoll (in meinem Fall in meine Extensions/Protocols Datei)

protocol ReturnPlayerInfoDelegate { 
    func returnPlayerInfo(playerName : String, playerType : Player.Type) 
} 

Dann habe ich meine Referenz (als Klasse var) an die Delegierten in der angerufene-View-Controller.Beachten Sie dies nicht benötigte meine Subklassen meinen Anrufers oder das Hinzufügen, das Protokolls zu meinem genannt View Controller:

class AddPlayerViewController : UIViewController { 
    static var delegate : ReturnPlayerInfoDelegate! 

und rief die Delegierten in meiner Ok-Taste handler:

@IBAction func onOK(sender: UIButton) { 
     AddPlayerViewController.delegate.returnPlayerInfo(mPlayerName.text!, playerType: mPlayerTypeActual) 
    dismissViewControllerAnimated(true, completion: nil) 
} 

Jetzt implementiert ich die Delegaten im CALLING ViewController:

class FiveKings : UIViewController, UIGestureRecognizerDelegate, UIPopoverPresentationControllerDelegate ,UITextViewDelegate , ReturnPlayerInfoDelegate { 
... 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     AddPlayerViewController.delegate = self 
... 
    func returnPlayerInfo(playerName : String, playerType : Player.Type) { 
     mGame.addPlayer(playerName, newPlayerClass: playerType, fKActivity: self) 
} 

Das funktioniert sehr gut. Sehen Sie irgendwelche Probleme mit meiner Implementierung?

+0

Sie sagten, Sie wären durch die Antwort mit Delegierten verwirrt. Und Sie verwenden auch Delegat in Ihrer Antwort. Was meintest du damit, du wärst verwirrt? –

+0

Sie müssen auch sicherstellen, dass Ihre Delegat-Variable schwach ist, um einen Speicherzyklus zu verhindern 'statisch schwach var delegate: ReturnPlayerInfoDelegate?' –

0

Hope this helfen Ihnen

Dies ist der zweite Controller von dem Sie Daten zurück zu geschoben werden soll. SecondView.swift

@objc protocol returnDataProtocol { 
    func returnStringData(myData: String) 
} 




class SecondView: UIViewController { 


     weak var delegate: returnStringData? 


     @IBAction func readyButtonPressed(sender: AnyObject) { 

     // Do what you want here 

     delegate?.returnStringData("Euro/Dollar etc....") 
     // this function is exist in first view controller 

     } 
    } 

Erster Blick Viewcontroller firstView.swift

class firstView: UIViewController, returnDataProtocol { 
    // this function will call to second view. You can use here push method, if you are using navigation controller. 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "mySegue" { // your identifier here 
      let controller = segue.destinationViewController as! MyPopOverController 
      controller.delegate = self 
     } 
    } 

    // here you will get return value from second view controller class 

    func returnStringData(myData: String){ 
      print(myData) 
     } 

} 
Verwandte Themen