【问题标题】:Issues passing data from text field with unwind segue使用 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"

标签: ios swift segue unwind-segue


【解决方案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 吗?
猜你喜欢
  • 2016-05-20
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2016-12-20
相关资源
最近更新 更多