はじめに
久々にアプリを0から作り始めたところ、何やらSceneDelegate.swiftが自動生成され、AppDelegateのライフサイクル関数群が移動したことにより、AppDelegateがすっきりした印象を受けた。
開発し初め早々につまづいたのですが、Main画面(Main.Stroryboard)から Push遷移 ができない事件が発生...
普段つまづくことのない部分のため問題解決に時間がかかってしまいましたので、
もし同じようなことでつまづいていましたら、参考にしていただけたらと思います。
本題
<解決したい内容>
ボタンを押して、コードから ExamViewController へPush遷移をしたい
<現状>
スクリーン内の「Button」をタップすると、tapButton関数が呼び出されます。
ストリーボード名「Exam」、StoryboardID「Exam」で定義されている、 ExamViewController をインスタンス化しており、ここまでは問題がない。
Push関数を実行してもPush遷移が行われない。
<解決方法>
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
self.window?.rootViewController = createFirstViewController() // <- 新規追加
self.window?.makeKeyAndVisible() // <- 新規追加
}
// 途中省略 ----
extension SceneDelegate { // <- 新規追加 & createFirstViewController関数作成
func createFirstViewController() -> UINavigationController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateInitialViewController() as! ViewController
let navigationController = UINavigationController()
navigationController.view.backgroundColor = .white
let firstViewController = viewController
navigationController.viewControllers = [firstViewController]
navigationController.setNavigationBarHidden(true, animated: false)
return navigationController
}
}
MainのViewController配下に、NavigationControllerが定義されていないため、このような現象が起きていた。
上記のコードを SceneDelegate.swift 内に追加してあげることで、問題解決!