2017-01-12 32 views
0

我正在按照接受的答案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() 
    } 

} 
+0

如果你把断点放在'print(“dataPassed from ViewControllerB:”+ sourceViewController.dataPassed!)''会发生什么?你可以检查'sourceViewController'并查看哪些属性被定义? – brandonscript

+0

对于它的价值,我认为你是对的 - 在调用“textFieldDidEndEditing”之前发生了关闭视图控制器的IBAction事件。你可以改变事物的顺序,并让done按钮处理辞职的第一响应者,并有一个不同的按钮或功能来关闭视图控制器。 – brandonscript

+0

@mosley - 你是否试过在'unwindToThisControllerWithSegue'里面说'dataPassed = sourceViewController.textField.text'?而不是等待'UITextField'委托来调用'textFieldDidEndEditing(_ :)',它可以只取得当前在textField中的任何文本。只是一个想法 – Pierce

回答

0

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

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 
} 

而且它工作正常。也许如果你可以分享你正在做的示例项目,我可以看到它为什么不起作用? :)

+0

不知道如何分享整个项目。 – mosley

+0

@mosley Github,dropbox等。还有一个问题,是在ViewControllerB中进入'textFieldDidEndEditing'的断点? – ebby94