从视图控制器Xcode传回数据

时间:2014-08-27 08:57:02

标签: ios xcode uiviewcontroller swift

几周前,我问了this问题并得到了非常详细的解释。现在我想将数据传递回第一个ViewController,但我仍然使用相同的方法卡住了。我有第一个VC的模态到第二个,我想编辑一个字符串数组,这将再次显示在第一个视图上。所以在我的第一个视图中我有一个数据数组,应该传递给第二个,因此编辑字段显示当前信息,之后用户必须能够编辑数组的内容并将数据传递回第一个它显示在标签上。我正在使用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]
}

谢谢

3 个答案:

答案 0 :(得分:37)

您需要使用委托。以下是如何在Swift中使用委托的示例。

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

例如,如果您使用的是Storyboard编辑器:

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

编写一个协议并定义一个函数来重写你的值

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

答案 1 :(得分:0)

我对使用代表的答案感到困惑,因为在我看来,这对我来说是不必要的复杂。这是我在卡片游戏中弹出添加播放器对话框所做的操作,并将结果传递回调用视图控制器。

添加委托协议(在我的案例中,在我的扩展程序/协议文件中)

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

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

class AddPlayerViewController : UIViewController {
     static var delegate : ReturnPlayerInfoDelegate!

并在我的Ok按钮处理程序中调用委托:

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

这很好用。你看到我的实施有什么问题吗?

答案 2 :(得分:0)

希望这会对你有所帮助

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

}