【问题标题】:Passing data back from view controllers Xcode从视图控制器 Xcode 传回数据
【发布时间】:2014-10-20 18:54:19
【问题描述】:

几周前,我问了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]
}

谢谢

【问题讨论】:

  • 你的代码在哪里?
  • 对不起,我更新了我的 OP

标签: ios xcode uiviewcontroller swift


【解决方案1】:

您需要使用委托。这是一个如何在 Swift 中使用委托的示例。

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

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

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

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

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

【讨论】:

  • 你还需要指出你的第一个视图控制器实现了协议:class ViewController: UIViewController, writeValueBackDelegate {
  • 我们不能在这里使用闭包来达到同样的效果吗?
  • @derdida 我可以采取相反的方式将数据从 FirstViewController 管理到 SecondViewController 吗?谢谢
  • 当然:在这里查看我的答案:stackoverflow.com/questions/26089152/…
  • 是否应该将var secondViewController = (segue.destinationViewController.visibleViewController as MySecondViewControllerClass) secondViewController.delegate = self 放入prepare for segue方法中?
【解决方案2】:

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

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

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

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

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

这很好用。你觉得我的实现有什么问题吗?

【讨论】:

  • 您说您对使用代表的答案感到困惑。而且您还在回答中使用了委托。你是什​​么意思你感到困惑?
  • 你还需要确保你的委托变量是弱的以防止内存循环static weak var delegate : ReturnPlayerInfoDelegate?
【解决方案3】:

希望对你有帮助

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2017-02-13
    • 2017-03-14
    • 2016-11-28
    • 2015-02-22
    相关资源
    最近更新 更多