SwiftUIで作ったViewをStoryboardで使用する
UIHostingControllerを継承したクラスを作成して
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder, rootView: ContentView())
}
このように初期化時にSwiftUIのViewをrootViewに指定します。
全体のコードです
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello World")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class ContentViewHostingController: UIHostingController<ContentView> {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder, rootView: ContentView())
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
呼び出しは通常のSotryboardからの初期化と同じです。
let vc = UIStoryboard(name: "ContentViewHostingController", bundle: nil).instantiateViewController(identifier: "ContentViewHostingController")
(補足) UIHostingControllerのライフサイクルについて
バグなのか仕様なのかはわかりませんが、
SwiftUIのViewからコードでContentViewHostingControllerへ遷移させたところ viewDidLoad
が呼ばれませんでした。
上記のようにStoryboardからの呼び出しであれば viewDidLoad
が呼ばれたので補足として書いておきます。