質問: 1 //xはA画面の変数 } ``` のようにしました。 しかし ``` Could not cast value of type 'UINavigationController' ``` とエラーが出ます。 この問題を解決するための方法を教えて欲しいです。 また上記の方法に代わる方法があれば 教えてもらえると助かります。 どうかよろしくお願いします。 --- 一度、unwindを使いましたが私はnavigation barに出てくるbackボタンを押したときに値を渡したいんのですがunwindではできませんでした。
回答: NavigationBarのBackボタンを押した時、おっしゃるとおり、UnwindセグエのActionメソッドは呼ばれません。しかし、`UINavigationControllerDelegate`の`navigationController(_:willShow:animated:)`は呼ばれるので、これを利用します。 *BViewController* ``` import UIKit class NextViewController: UIViewController, UINavigationControllerDelegate { // クラス宣言に、UINavigationControllerDelegateを追加。 override func viewDidLoad() { super.viewDidLoad() // BViewController自身をDelegate委託相手とする。 navigationController?.delegate = self } // UINavigationControllerDelegateのメソッド。遷移する直前の処理。 func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { // 遷移先が、AViewControllerだったら...... if let controller = viewController as? AViewController { // AViewControllerのプロパティvalueの値変更。 controller.value = 100 } } } ``` *AViewController* ``` import UIKit class AViewController: UIViewController { var value: Int = 0 { didSet { print("New value = \(value)") } } // プロパティオブザーバにする必要はないが、Delegateメソッドが働いていることを確認するため実装しています。 // Other codes } ``` > > NavigationControllerでつないだ親画面A、子画面Bがあります。 > > > `UINavigationController`ベースの画面遷移で、遷移元、遷移先の関係を親子と表現するのは、なじみがよくありません。`UIViewController`のプロパティ`parentViewController`は、エラーメッセージに述べられているように、親は`UINavigationController`になります。`AViewContoller`と`BViewController`は、子どうし、むしろ兄弟関係というべきでしょう。 > > let viewController = self.parentViewController as! A ViewController > > > Swiftの書式では、変数名にスペースを含めることはできません。`A ViewController`ではエラーになるか、誤動作になります。`AViewController`とするか、アンダーバーを使って、`A_ViewController`としてください。