2017-01-12 9 views
0

this質問に対する回答に従っていますが、ViewControllerB(第2のView Controller)からViewController(初期View Controller)にデータを渡す際に問題が発生しています。私が追加したいくつかの印刷ステートメントの出力に基づいて、への巻き戻しはtextFieldDidEndEditingの前に起こっていると思います。テキストフィールドのデータをunwind segueで渡す際の問題

dataPassed from ViewControllerB: Default passed data 
newValue: Default passed data 
textFieldDidEndEditing: Pass this back 

私は正常ViewControllerB上のボタンへの出口を作成しdataPassed = textField.textを設定することによってバックViewControllerにデータを渡すことができました。私がこれを働かせるもう一つの方法は、unwindToThisController機能でdataReceived = sourceViewController.dataPasseddataReceived = 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コード(第2ビューコントローラ)

/* 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(" viewControllerB: "+ sourceViewController.dataPassed!)から送られたデータにブレークポイントを置くとどうなりますか? 'sourceViewController'を調べて、どのプロパティが定義されているのか確認できますか? – brandonscript

+0

価値があると思いますが、あなたが正しいと思うのは、 'textFieldDidEndEditing'が呼び出される前にView Controllerを終了するIBActionイベントが起きていることです。あなたは物事の順序を変更し、完了ボタンが最初のレスポンダを辞めることに対処し、ビューコントローラを破棄する別のボタンまたは機能を持つことができます。 – 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

関連する問題