使用 unwind segue 从文本字段传递数据的问题

Posted

技术标签:

【中文标题】使用 unwind segue 从文本字段传递数据的问题【英文标题】:Issues passing data from text field with unwind segue 【发布时间】: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" 【参考方案1】:

我是这个问题的提问者,幸运的是我有那个示例项目的备份,这就是我在那里找到的。这就是我在第一个视图控制器中所做的

var displayValue: Double
    get
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    
    set
        display.text?="\(newValue)"
        typing=false
    

@IBAction func unwind(segue: UIStoryboardSegue)
    let foo = segue.sourceViewController as! viewControllerB
    let a = foo.dataSent
    displayValue = NSNumberFormatter().numberFromString(a!)!.doubleValue

而且它运行良好。也许如果您可以分享您正在处理的示例项目,我可以看到它为什么不起作用? :)

【讨论】:

@mosley Github、dropbox 等。还有一个问题,断点是在 ViewControllerB 中进入 textFieldDidEndEditing 吗?

以上是关于使用 unwind segue 从文本字段传递数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 unwind segue 传递数据

从 Unwind segue 触发时,Push segue 不起作用

将数据从文本字段传递到下一个视图

iOS从推送segue中检测unwind segue

unwind segue / performSegueWithIdentifier: 问题

使用 unwind segues 推送数据