こんな感じで動いて欲しかった
下のような感じで遷移させたかった。左はMainのView、右はAddView。
1.『右上のプラスボタン』を押す。
2.モーダル遷移でView(AddView)が表示される。
1.どんな場面で起こったのか?
2.クラッシュの内容
Thread 1: "Storyboard () doesn't contain a view controller with identifier 'AddView'"
『そんなIDを持ったViewControllerはこのstoryboardにはない。』
3.問題のコードと、わかっていなかったこと
//AddViewへ遷移させるためのボタン。
//Buttonが置いてあるのはMainのViewController。
@IBAction func toAddButtonAction(_ sender: Any) {
let toAddView = storyboard?.instantiateViewController(withIdentifier: "AddView") as! AddViewController
present(toAddView, animated: true)
}
- storyboardプロパティって何???
- withIdentifierは間違っていないのになぜ???
4.解決
@IBAction func toAddButtonAction(_ sender: Any) {
let storyboard = UIStoryboard(name: "AddView", bundle: nil)
let addView = storyboard.instantiateViewController(withIdentifier: "AddView") as! AddViewController
let nav = UINavigationController(rootViewController: addView)
addView.delegate = self
present(nav, animated: true)
}
- まず、storyboardプロパティとは?
- リファレンスによると、storyboardプロパティはViewControllerの元になるStoryboardだそうです。注意点は今回『右上のプラスボタン』を置いたのがMainのStoryboardだということ。紐付いているのはViewControllerです。
- このViewControllerの中でstoryboardプロパティを使用すると、そのstoryboardプロパティはMainのStoryboardを指します。
- クラッシュしたコードでは、画面をMainViewとAddViewを分けています。そのような場合、ViewControllerのstoryboardにはAddViewが持つIDは反映されないため、クラッシュを起こしてしまったと考えられます。
なので,以下の部分で明示的に名前を指定した後に、.instantiateViewControllerメソッドを使ってあげます。
//明示的に名前を指定
let storyboard = UIStoryboard(name: "AddView", bundle: nil)
let addView = storyboard.instantiateViewController(withIdentifier: "AddView") as! AddViewController
クラッシュは起こさずに遷移してくれるようになりました。
『.instantiateViewController() 』については以下を参照