結論から言うと
AnyViewを使えばよかった話(よくはない)
チュートリアルから
勉強をはじめたばかりです。ということで、この間チュートリアルは一通りやりました(理解したとは言えない)
やりたいことは、Interfacing with UIKitでやる画面切替で、SwiftUIのViewを複数使うこと。
画面をスワイプで切り替えるだけなら簡単やんけ、と思って調べてみたが、なかなかいい方法がなかったので、チュートリアルのコードを下記のように変えてみた。
元のPageView.swift
var viewControllers: [UIHostingController<Page>]
@State var currentPage = 0
init(_ views: [Page]) {
self.viewControllers = views.map { UIHostingController(rootView: $0) }
}
var body: some View {
ZStack(alignment: .bottomTrailing) {
PageViewController(controllers: viewControllers, currentPage: $currentPage)
PageControl(numberOfPages: viewControllers.count, currentPage: $currentPage)
.padding(.trailing)
}
}
修正PageView.swift
@State var currentPage = 0
var viewControllers: [UIHostingController<AnyView>] {
var _views: [AnyView] = []
// ここらへんで突っ込みたいビューの初期化をする
_views.append(AnyView(CustomView1()))
_views.append(AnyView(CustomView2()))
return _views.map {UIHostingController(rootView: $0)}
}
var body: some View {
ZStack(alignment: .bottomTrailing) {
// PageViewControllerのほうはAnyViewを引数で取れるようにしておく
PageViewController(controllers: viewControllers, currentPage: $currentPage)
PageControl(numberOfPages: viewControllers.count, currentPage: $currentPage)
.padding(.trailing)
}
}
最後に
勉強中なので、できればAnyViewじゃなくて指定Viewだけを渡せるようにしてあげたいけど、どうすればいいのかわかりません。
(そもそもListの型をinterfaceで指定したい、という気持ちなだけなのです。。。)
よいやり方などをご存知の方がいらっしゃいましたら、ご教授いただけると助かります。。。