概要
アプリを作っているときに次の画面への値渡しは遷移先のViewControllerのインスタンスを取得したり、prepare(for segue: UIStoryboardSegue, sender: Any?)
を用いることで行えます。
今回はその逆で、遷移した先の画面から 遷移元の画面へ値を渡す 方法についてです。
NavigationControllerなし
画面の遷移にNavigationControllerが関係していない状態での値の受け渡し方法です。多くの場合はこの方法を用いると思います。
let preVC = self.presentingViewController as! PreviousViewController
preVC.variable = self.variable //ここで値渡し
UIViewControllerのプロパティであるpresentingViewController
には遷移元のViewControllerのインスタンスが格納されているので、それを取得してやれば値を受け渡せます。
NavigationControllerあり
上記のようにpresentingViewController
を取得するところまでは同じ流れですが、プロパティにNavigationControllerが格納されるので以降の処理が少し変わります。
Showではない遷移をしてきたとき
let preNC = self.presentingViewController as! UINavigationController
// let preNC = self.navigationController as! UINavigationController でも可能かと思います
let preVC = preNC.viewControllers[preNC.viewControllers.count - 1] as! PreviousViewController
preVC.variable = self.variable //ここで値渡し
Showで遷移してきたとき
let preNC = self.presentingViewController as! UINavigationController
// let preNC = self.navigationController as! UINavigationController
let preVC = preNC.viewControllers[preNC.viewControllers.count - 2] as! PreviousViewController
preVC.variable = self.variable //ここで値渡し
補足説明のようなもの
UINavigationControllerのプロパティであるviewControllers
は、公式ドキュメントを参照すると
The root view controller is at index 0 in the array, the back view controller is at index n-2, and the top controller is at index n-1, where n is the number of items in the array.
のように記述されています。つまりviewControllers
の0番目にはroot view controller、n-1番目には表示されているViewController、n-2番目には一つ前のViewControllerが格納されているようです。