🔨

SwiftUI - popToRootViewControllerと同じ処理をする方法

2022/05/21に公開

作るもの

SwiftUIでSwiftのpopToRootViewControllerと同じように2つ以上前の画面に戻る処理を実装します。

完成イメージ

完成コード

import SwiftUI

struct ContentView: View {
    @State var isActive : Bool = false

    var body: some View {
        NavigationView {
            NavigationLink(
                destination: ContentView2(isActive: $isActive), isActive: $isActive) {
                Text("次へ")
            }
            .navigationBarTitle("1つ目の画面")
        }
    }
}

struct ContentView2: View {
    @Binding var isActive : Bool

    var body: some View {
        NavigationLink(destination: ContentView3(isActive: $isActive)) {
            Text("次へ")
        }
        .navigationBarTitle("2つ目の画面")
    }
}

struct ContentView3: View {
    @Binding var isActive : Bool

    var body: some View {
        VStack {
            Button (action: {
                isActive = false
            } ){
                Text("最初の画面に戻る")
            }
        }.navigationBarTitle("3つ目の画面")
    }
}

ポイント

@State var isActive : Bool = false

まず1番最初の画面でNavigationLinkのオンオフを制御する変数「isActive」を定義します。
これをNavigationLinkの「isActive:」という引数に入れると、trueの時に次の画面に移動し、falseの時に元の画面に戻るようになります。

変数を受け継ぐ

NavigationLink(destination: ContentView2(isActive: $isActive), isActive: $isActive)

定義した変数を@Bindingを使って次の画面へ受け継いでいきます。
NavigationLinkをタップするとisActiveがfalseからtrueに切り替わります。

最初に戻る

isActive = false

最後の画面の「isActive」も最初の画面のものと繋がっているので、ここをfalseにセットすると最初の画面まで戻ります。
https://stackoverflow.com/questions/57334455/swiftui-how-to-pop-to-root-view?answertab=scoredesc#tab-top

Discussion