Ios 从视图控制器Xcode传回数据

Ios 从视图控制器Xcode传回数据,ios,xcode,uiviewcontroller,swift,Ios,Xcode,Uiviewcontroller,Swift,几周前,我问了这个问题,得到了非常详细的解释。现在我想将数据传递回第一个ViewController,但我一直使用相同的方法。我有一个从第一个VC到第二个VC的模式,我想编辑一个字符串数组,它将再次显示在第一个视图中。因此,在我的第一个视图中,我有一个数据数组,它应该传递给第二个视图,以便编辑字段显示当前信息,之后用户必须能够编辑数组的内容,并将该数据传递回第一个视图,在第一个视图中它显示在标签上。我用的是斯威夫特 我的代码: (在ViewController.swift中:) (在Second

几周前,我问了这个问题,得到了非常详细的解释。现在我想将数据传递回第一个ViewController,但我一直使用相同的方法。我有一个从第一个VC到第二个VC的模式,我想编辑一个字符串数组,它将再次显示在第一个视图中。因此,在我的第一个视图中,我有一个数据数组,它应该传递给第二个视图,以便编辑字段显示当前信息,之后用户必须能够编辑数组的内容,并将该数据传递回第一个视图,在第一个视图中它显示在标签上。我用的是斯威夫特

我的代码:

(在ViewController.swift中:)

(在SecondViewController.swift中:)


谢谢

您需要使用一名代表。下面是如何在Swift中使用委托的示例

在第一个ViewController上,在加载第二个VC时设置代理:

例如,如果您使用的是情节提要编辑器:

var secondViewController = (segue.destinationViewController.visibleViewController as  MySecondViewControllerClass)
secondViewController.delegate = self
编写一个协议并定义一个func来写回值

例如,创建一个名为“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")

我对使用代理的答案感到困惑,因为在我看来,这似乎是不必要的复杂。下面是我在纸牌游戏中弹出的添加玩家对话框,并将结果传递回调用视图控制器时所做的操作

添加代理协议(在我的扩展名/协议文件中)

然后,我将我的引用(作为类变量)添加到被调用的视图控制器中的委托中。注意,这不需要我对调用方进行子类化,也不需要将协议添加到调用的视图控制器:

class AddPlayerViewController : UIViewController {
     static var delegate : ReturnPlayerInfoDelegate!
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)
}
并在“确定”按钮处理程序中调用代理:

    @IBAction func onOK(sender: UIButton) {
      AddPlayerViewController.delegate.returnPlayerInfo(mPlayerName.text!, playerType: mPlayerTypeActual)
    dismissViewControllerAnimated(true, completion: nil)
}
现在,我在调用ViewController中实现了委托:

class AddPlayerViewController : UIViewController {
     static var delegate : ReturnPlayerInfoDelegate!
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)
}

这个很好用。您认为我的实现有什么问题吗?

希望这对您有所帮助

这是第二个控制器,您希望从中将数据返回到该控制器。 斯威夫特酒店

第一视图视图控制器 斯威夫特


您的代码在哪里?抱歉,我更新了我的操作。您还需要指出您的第一个视图控制器实现了以下协议:
class ViewController:UIViewController,writeValueBackDelegate{
我们不能在这里使用闭包来实现同样的功能吗?@derdida我可以用相反的方法将数据从FirstViewController管理到SecondViewController吗?谢谢:请查看我的答案:应该
var SecondViewController=(segue.destinationViewController.visibleViewController作为MySecondViewController类)secondViewController.delegate=self
是否被放入“为segue做准备”方法?您说您对使用委托的答案感到困惑。您在回答中也使用了委托。您困惑的意思是什么?您还需要确保您的委托变量很弱,以防止内存循环
静态弱变量delegate:ReturnPlayerInfo代理?
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)
}
@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 

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

}