我正在按照接受的答案this问题,但我有问题将ViewControllerB
(第二个视图控制器)的数据传递回ViewController
(初始视图控制器)。根据我添加的一些印刷报表的输出,我认为ViewController
的展开发生在textFieldDidEndEditing
之前。问题传递数据从文本字段展开segue
dataPassed from ViewControllerB: Default passed data
newValue: Default passed data
textFieldDidEndEditing: Pass this back
我能够成功地对ViewControllerB
创建的出口到该按钮并设定dataPassed = textField.text
将数据传递回ViewController
。另一种方法是使unwindToThisController
函数中的dataReceived = sourceViewController.dataPassed
更改为dataReceived = sourceViewController.textField.text
。但它看起来不像上面提到的接受答案的海报使用任何一种或这些解决方法,并且我不确定这些解决方法中的任何一种是否是可接受的方式来执行此操作。
我使用的Xcode 8.2.1和夫特3.
的ViewController码(初始视图控制器)
/* ViewController.swift */
import UIKit
class ViewController: UIViewController {
var dataReceived: String? {
willSet {
print("newValue: " + newValue!)
labelOne.text = newValue
}
}
@IBOutlet weak var labelOne: UILabel!
@IBAction func buttonOne(_ sender: UIButton) {
performSegue(withIdentifier: "viewNext", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
labelOne.text = "Default passed data"
}
// Segue ViewController -> ViewControllerB
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "viewNext" {
let viewControllerB = segue.destination as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
// Segue ViewController <- ViewControllerB
@IBAction func unwindToThisControllerWithSegue(sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? ViewControllerB {
print("dataPassed from ViewControllerB: " + sourceViewController.dataPassed!)
dataReceived = sourceViewController.dataPassed
//dataReceived = sourceViewController.textField.text
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
ViewControllerB码(第二视图控制器)
/* ViewControllerB.swift */
import UIKit
class ViewControllerB: UIViewController, UITextFieldDelegate {
var dataPassed: String?
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.text = dataPassed
textField.delegate = self
}
// Text field delegate methods
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
print("textFieldDidEndEditing: " + textField.text!)
dataPassed = textField.text
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
如果你把断点放在'print(“dataPassed from ViewControllerB:”+ sourceViewController.dataPassed!)''会发生什么?你可以检查'sourceViewController'并查看哪些属性被定义? – brandonscript
对于它的价值,我认为你是对的 - 在调用“textFieldDidEndEditing”之前发生了关闭视图控制器的IBAction事件。你可以改变事物的顺序,并让done按钮处理辞职的第一响应者,并有一个不同的按钮或功能来关闭视图控制器。 – brandonscript
@mosley - 你是否试过在'unwindToThisControllerWithSegue'里面说'dataPassed = sourceViewController.textField.text'?而不是等待'UITextField'委托来调用'textFieldDidEndEditing(_ :)',它可以只取得当前在textField中的任何文本。只是一个想法 – Pierce