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