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.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コード(第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()
}
}
あなたが 'print(" viewControllerB: "+ sourceViewController.dataPassed!)から送られたデータにブレークポイントを置くとどうなりますか? 'sourceViewController'を調べて、どのプロパティが定義されているのか確認できますか? – brandonscript
価値があると思いますが、あなたが正しいと思うのは、 'textFieldDidEndEditing'が呼び出される前にView Controllerを終了するIBActionイベントが起きていることです。あなたは物事の順序を変更し、完了ボタンが最初のレスポンダを辞めることに対処し、ビューコントローラを破棄する別のボタンまたは機能を持つことができます。 – brandonscript
@mosley - 'unwindToThisControllerWithSegue'の中に' dataPassed = sourceViewController.textField.text'と言ってみましたか? 'UITextField'デリゲートが' textFieldDidEndEditing(_ :) 'を呼び出すのを待つのではなく、現在textFieldにあるテキストを取ることができます。ちょっと考えました – Pierce