LoginSignup
0
1

More than 3 years have passed since last update.

ViewControllerを使った画面切替で複数Viewを切り替えられるようにする

Posted at

結論から言うと

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で指定したい、という気持ちなだけなのです。。。)
よいやり方などをご存知の方がいらっしゃいましたら、ご教授いただけると助かります。。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1