下記の場合5-7行目でエラーが出る
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) {
if (segue?.identifier == "home_to_search") {
// ここでエラー
var searchKeyword = txtSearchBarHome.text
var svc = segue?.destinationViewController as! SearchViewController;
svc.toPassSearchKeyword = searchKeyword;
}
}
NavigationControllerが各Viewを配列で持っている
rootに近いほうが0
まずこの構造を理解しておく必要がある
こういう書き方も可能
まずUINavigationControllerへcastする
その上で,NavigationControllerのtopから目的の画面へcastする
その後もっていきたい変数を代入しておく。
/UINavigationControllerへcastする
let nav = segue?.destinationViewController as! UINavigationController
//目的の画面
let svc = nav.topViewController as! SearchViewController
//変数をset
svc.toPassSearchKeyword = searchKeyword
teratailではこのような回答があった。
階層を1段下げたということ
しかし美しくない
let nav = segue.destination as! UINavigationController
let subVC = nav.viewControllers[nav.viewControllers.count-1] as! SubVi
自分はこう書いた
まず、NavigationControllerを実装しているクラスからpushする
let nextVC = UIStoryboard(name: "DiaryCreate", bundle: nil).instantiateInitialViewController()!
//つぎの ViewControllerにsetしたい変数
nextVC.diary = diaryText.text
//push が+1
navigationController?.pushViewController(nextVC, animated: true)
戻るときはこれだけ popで遷移する
//popが -1
self.navigationController!.popViewController(animated: true)
Navigationbarのカスタマイズはこちらが参考になる。
teratail参考資料
https://teratail.com/questions/90266
StackOverFlow参考資料