从视图控制器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) } }