【发布时间】:2017-01-12 17:44:23
【问题描述】:
我正在关注this 问题的公认答案,但我在将数据从ViewControllerB(第二个视图控制器)传回ViewController(初始视图控制器)时遇到问题。根据我添加的一些打印语句的输出,我认为展开到ViewController 发生在textFieldDidEndEditing 之前。
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 和 Swift 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并查看正在定义的属性吗? -
对于它的价值,我认为你是对的 - 在调用
textFieldDidEndEditing之前发生了关闭视图控制器的 IBAction 事件。你可以改变事情的顺序,让完成按钮处理辞职的第一响应者,并有一个不同的按钮或功能来关闭视图控制器。 -
@mosley - 你试过在
unwindToThisControllerWithSegue里面说dataPassed = sourceViewController.textField.text吗?而不是等待UITextField代表调用textFieldDidEndEditing(_:)它可以只获取文本字段中当前的任何文本。只是一个想法 -
@mosley - 很抱歉是
dataReceived = sourceViewController.textField.text -
@brandonscript - 这是您要问的吗?看起来,虽然我输入了
Pass this data,然后按下了Return按钮,它仍然返回Default passed data。我不认为我可以发布屏幕截图,但这是属性 -dataPassed = (String?) "Default passed data"
标签: ios swift segue unwind-segue