webentwicklung-frage-antwort-db.com.de

Rückgabe der Daten vom View Controller Xcode

Vor ein paar Wochen habe ich this frage gestellt und eine sehr ausführliche Erklärung erhalten. Jetzt möchte ich Daten an den ersten ViewController zurückgeben, aber ich bleibe mit derselben Methode stecken. Ich habe einen Modal des ersten VC zum zweiten, wo ich ein Array von Strings bearbeiten möchte, das in der ersten Ansicht erneut angezeigt wird. Auf meiner ersten Ansicht habe ich ein Datenfeld, das an das zweite übergeben werden sollte. In den Bearbeitungsfeldern werden die aktuellen Informationen angezeigt, nach denen der Benutzer den Inhalt des Datenfelds bearbeiten und die Daten an das erste Objekt zurückgeben kann Es ist auf Etiketten angegeben. Ich verwende Swift.

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]
}

Vielen Dank

14
B_s

Sie müssen einen Delegierten verwenden. Hier ein Beispiel, wie ein Delegierter in Swift verwendet wird.

Legen Sie auf Ihrem ersten ViewController Ihren Delegaten fest, wenn Sie den zweiten VC laden:

Wenn Sie beispielsweise den Storyboard-Editor verwenden:

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

Schreiben Sie ein Protokoll und definieren Sie eine Funktion, um Ihre Werte zurückzuschreiben

Erstellen Sie zum Beispiel eine Datei mit dem Namen "Protocol.Swift" und schreiben Sie so etwas:

protocol writeValueBackDelegate {
    func writeValueBack(value: String)
}

Fügen Sie die Funktion Ihrem FirstViewController hinzu

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

Und zu deiner ViewControllerClass

class ViewController: UIViewController, writeValueBackDelegate

Die obige Zeile funktioniert nicht, wenn Sie nicht alle Methoden in ViewController implementiert haben, die Sie in Ihrer Protokolldatei definiert haben.

Gehen Sie zum Second View Controller und fügen Sie den Delegierten hier hinzu:

class SecondViewController: ViewController {

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

Auf Ihrem zweiten View Controller können Sie nun die Funktion im ersten View Controller aufrufen, um Daten zu übergeben.

delegate?.writeValueBack("That is a value")
37
derdida

Hoffe, das wird dir helfen 

Dies ist der zweite Controller, von dem aus Sie Daten zurückgeben möchten. 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 

        }
    }

Erste Ansicht 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)
       }

}
0
RviOS

Ich bin verwirrt über die Antwort mit Delegierten, weil sie mir unnötig kompliziert erscheint. So habe ich das Dialogfeld "Spieler hinzufügen" in meinem Kartenspiel geöffnet und die Ergebnisse an den aufrufenden Ansichts-Controller zurückgegeben.

Delegatenprotokoll hinzufügen (in meinem Fall in meiner Datei "Erweiterungen/Protokolle")

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

Dann fügte ich dem Delegaten im CALLED View Controller meine Referenz (als Klassenvariable) hinzu. Beachten Sie, dass dies nicht meine Unterklasse für meinen Anrufer oder das Hinzufügen des Protokolls zu meinem aufgerufenen View Controller erforderlich machte:

class AddPlayerViewController : UIViewController {
     static var delegate : ReturnPlayerInfoDelegate!

und rief den Delegaten in meinem Ok - Button-Handler an:

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

Nun habe ich den Delegaten im CALLING ViewController implementiert:

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 Probleme bei der Implementierung?

0
Opus1217