Blog

Could not cast value of type ‘UINavigationController’ エラーの原因について

NavigationControllerについての考察

下記の場合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が子ViewControllerを階層的に持っているという構造を理解する必要がある

NavigationControllerが各Viewを配列で持っている
rootに近いほうが0

まずこの構造を理解しておく必要がある

参照元:Apple公式ドキュメント

こういう書き方も可能
まず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 が+1 popが -1 これが大切!

自分はこう書いた

まず、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のカスタマイズはこちらが参考になる。

https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar

teratail参考資料

https://teratail.com/questions/90266

StackOverFlow参考資料

https://stackoverflow.com/questions/30209626/could-not-cast-value-of-type-uinavigationcontroller/48395718


一つ前の記事 firebase CSVファイル アップロード
次の記事 ベトナムの大学と日本の大学との違いについて。情報処理学部