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
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")
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)
}
}
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?