从视图控制器Xcode传回数据

几个星期前,我问了这个问题,得到了一个非常详细的解释。 现在我想传回数据到第一个ViewController,但我一直使用相同的方法卡住。 我有一个第一个VC的模式,第二个,我想编辑一个string数组,将再次显示在第一个视图。 所以在我的第一个视图中,我有一个数据的数组,应该传递给第二个,所以编辑字段显示当前的信息之后,用户必须能够编辑数组的内容并将数据传回第一个它显示在标签上。 我正在使用Swift。

我的代码:

(在ViewController.swift 🙂

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

(在SecondViewController.swift 🙂

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

谢谢

你需要使用一个委托。 这里是一个例子,如何在Swift中使用委托。

在你的第一个ViewController上,当你加载第二个VC时设置你的委托:

例如,如果您正在使用故事板编辑器:

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

写一个协议,并定义一个函数来给你写回值

例如,创build一个名为“Protocol.swift”的文件并写下如下所示:

 protocol writeValueBackDelegate { func writeValueBack(value: String) } 

将函数添加到您的FirstViewController

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

和你的ViewControllerClass

 class ViewController: UIViewController, writeValueBackDelegate 

如果你还没有实现你在协议文件中定义的ViewController中的所有方法,上面的代码行将不起作用。

转到第二个视图控制器,并在这里添加委托:

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

在你的第二个视图控制器上,你现在可以用它来调用第一个视图控制器中的func传递数据。

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

我对使用代表的答案感到困惑,因为在我看来,这是不必要的复杂的。 以下是我在卡片游戏中popup“添加播放器”对话框的过程,并将结果传递给调用视图控制器。

添加委托协议(在我的扩展/协议文件中)

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

然后,我将我的引用(作为类var)添加到CALLED View Controller中的委托中。 注意这不需要我的调用者的子类,或者将协议添加到我称为View Controller的协议中:

 class AddPlayerViewController : UIViewController { static var delegate : ReturnPlayerInfoDelegate! 

并在我的确定button处理程序中调用委托:

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

现在我在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) } 

这工作非常好。 你看到我的执行有什么问题吗?

希望对你有帮助

这是第二个控制器从你想要返回的数据推送。 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 } } 

先查看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) } }