質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

1回答

1853閲覧

【SwiftUI】SwiftUIからStoryboardを表示

Jene

総合スコア13

0グッド

0クリップ

投稿2021/10/14 11:44

前提・実現したいこと

以下のサイトを参考に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向け

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/10/14 22:56

Main.storyboard に ViewController を作って Initial View Controller にすればいいとは思いますが、viewDidAppear で present するとか、元の記事でやってることがおかしい気がしなくもないです…。
guest

回答1

0

google翻訳
Thread 1: Fatal error: オプション値のアンラップ中に予期せずnilが見つかりました

ってことなんで、そのエラーが出たところでの変数の値をチェックしてみましょう

投稿2021/10/14 11:54

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問