前提・実現したいこと
以下のサイトを参考にSwiftUIからStoryboardを表示させたいと思っています。
(参考サイト)
SwiftUIからStoryboardを表示させる またその逆 ?
発生している問題・エラーメッセージ
記載されているサンプルコードを実行したところ、Storyboardを呼び出す際にプレビュー画面がクラッシュしてしまい、以下のようなエラーが出てしまいました。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
該当のソースコード
参考サイトにも記載されていますが、こちらにも転記致します。
Swift
1import UIKit 2import SwiftUI 3 4struct ContentView: View { 5 6 @State var showingDetail0 = false 7 @State var showingDetail1 = false 8 9 var body: some View { 10 VStack { 11 Spacer() 12 Text("アクセス方法") 13 .font(.largeTitle) 14 Spacer() 15 Button(action: { 16 self.showingDetail0.toggle() 17 }) { 18 Text("SwiftUIViewを表示します!") 19 .font(.title) 20 }.sheet(isPresented: $showingDetail0) { 21/*⭐️*/ SwiftUI() 22 } 23 Spacer() 24 Button(action: { 25 self.showingDetail1.toggle() 26 }) { 27 Text("Storyboardを表示します!") 28 .font(.title) 29 }.sheet(isPresented: $showingDetail1) { 30/*⭐️⭐️*/ UIView() 31 } 32 Spacer() 33 } 34 } 35} 36 37struct ContentView_Previews: PreviewProvider { 38 static var previews: some View { 39 ContentView() 40 } 41} 42/*⭐️*/ 43struct SwiftUI: View { 44 45 var body: some View { 46 Text("Hello world") 47 } 48 49} 50 51//struct SwiftUI_Previews: PreviewProvider { 52// static var previews: some View { 53// SwiftUI() 54// } 55// 56//} 57/*⭐️・ここまで*/ 58 59/*⭐️⭐️*/ 60struct UIView: View { 61 var body: some View { 62/*✳️*/ UIViewControllerViewWrapper { 63 Text("Hello world") 64 } 65 } 66 67} 68 69//struct UIView_Previews: PreviewProvider { 70// static var previews: some View { 71// UIView() 72// } 73// 74//} 75/*⭐️⭐️・ここまで*/ 76 77class ViewController: UIViewController { 78 79 override func viewDidLoad() { 80 super.viewDidLoad() 81 // Do any additional setup after loading the view. 82 83print("5-91・通過・ViewController") 84 } 85 86//⭐️解説⭐️ Main.storyboardのViewにButtonを設置して接続してください 87 @IBAction func 戻る(_ sender: UIButton) { 88 let contentView: UIHostingController = UIHostingController(rootView: ContentView()) 89 contentView.view.frame = self.view.bounds 90 self.addChild(contentView) 91 self.view.addSubview(contentView.view) 92 contentView.didMove(toParent: self) 93 } 94 95} 96/*✳️✳️・ここから*/ 97class ViewControllerWithStoryboard: UIViewController { 98 99 override func viewDidLoad() { 100 super.viewDidLoad() 101print("2-109・通過・viewDidLoad") 102 103 } 104 // View構築後の処理 105 override func viewDidAppear(_ animated: Bool) { 106 super.viewDidAppear(animated) 107print("4-115・通過・viewDidAppear") 108 109 let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 110 ///////////// ↓エラー発生箇所 ////////////////// 111 let nextView = storyboard.instantiateInitialViewController() as! ViewController 112 //////////////////////////////////////////// 113 nextView.modalPresentationStyle = .fullScreen 114 present(nextView, animated: false, completion: nil) 115 116 } 117} 118/*✳️✳️・ここまで*/ 119 120/*✳️・ここから*/ 121struct UIViewControllerViewWrapper<Content: View>: UIViewControllerRepresentable { 122 123 //The type of view controller to present. 124 //Required. 125 typealias UIViewControllerType = ViewControllerWithStoryboard 126 127 var content: () -> Content 128 129 func makeUIViewController(context: Context) -> ViewControllerWithStoryboard { 130 //Creates the view controller object and configures its initial state. 131 //Required. 132 let viewControllerWithStoryboard = ViewControllerWithStoryboard() 133print("1-139・通過・makeUIViewController・") 134 return /*✳️✳️*/viewControllerWithStoryboard 135 } 136/*⭐️*/ 137 func updateUIViewController(_ uiviewController: ViewControllerWithStoryboard, context: Context) { 138 //Updates the state of the specified view controller with new information from SwiftUI. 139 //Required. 140print("3-146・通過・updateUIViewController・") 141 } 142} 143
試したこと
オプショナルに関するエラーということはわかったのですが、実際にどのように対処すればいいのか分からない状況です。
知見がある方ご教授頂けますと幸いです。
補足情報(FW/ツールのバージョンなど)
Xcode 13.0
iOS 14.0向け
Main.storyboard に ViewController を作って Initial View Controller にすればいいとは思いますが、viewDidAppear で present するとか、元の記事でやってることがおかしい気がしなくもないです…。