例によるSwiftUI(SwiftUI by Example)10 Presenting views

新しいビューをNavigationViewにプッシュする方法
How to push a new view onto a NavigationView

//-----------------------------------
struct DetailView: View {
    var body: some View {
        Text("This is the detail view")
    }
}
//-----------------------------------
struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView()) {
                    Text("Show Detail View")
                }.navigationBarTitle("Navigation")
            }
        }
    }
}//-----------------------------------

リスト行がタップされたときに新しいビューをプッシュする方法
How to push a new view when a list row is tapped

//-----------------------------------
struct RestaurantView: View {
    var restaurant: Restaurant

    var body: some View {
        Text("Come and eat at \(restaurant.name)")
            .font(.largeTitle)
    }
}
//-----------------------------------
struct Restaurant: Identifiable {
    var id = UUID()
    var name: String
}
//-----------------------------------
struct RestaurantRow: View {
    var restaurant: Restaurant

    var body: some View {
        Text(restaurant.name)
    }
}
//-----------------------------------
struct ContentView: View {
    var body: some View {
        let first = Restaurant(name: "Joe's Original")
        let restaurants = [first]

        return NavigationView {
            List(restaurants) { restaurant in
                NavigationLink(destination: RestaurantView(restaurant: restaurant)) {
                    RestaurantRow(restaurant: restaurant)
                }
            }.navigationBarTitle("Select a restaurant")
        }
        
    }
}
//-----------------------------------

シートを使用して新しいビューを表示する方法
How to present a new view using sheets

//-----------------------------------
struct DetailView: View {
    var body: some View {
        Text("Detail")
    }
}
//-----------------------------------
struct ContentView: View {
    @State var showingDetail = false

    var body: some View {
        Button(action: {
            self.showingDetail.toggle()
        }) {
            Text("Show Detail")
        }.sheet(isPresented: $showingDetail) {
            DetailView()
        }
    }
}
//-----------------------------------

ビューを却下する方法
How to make a view dismiss itself

Swiftでこれを解決する方法は2つあります。両方を紹介して、どちらがニーズに合っているかを判断できるようにします。

環境プロパティ
バインディングを渡すこと

//-----------------------------------
struct DetailView: View {
    // 方法①
    //@Environment(\.presentationMode) var presentationMode
    
    // 方法②
    @Binding var isPresented: Bool
    
    var body: some View {
        Text("Detail")
        Button(action: {
            // 方法①
            //self.presentationMode.wrappedValue.dismiss()
            
            // 方法②
            self.isPresented = false
            
        }){
            Text("Show Detail")
        }
    }
}
//-----------------------------------
struct ContentView: View {
    @State var showingDetail = false
    

    var body: some View {
        Button(action: {
            self.showingDetail.toggle()
        }) {
            Text("Show Detail")
        }.sheet(isPresented: $showingDetail) {
            // 方法①
            //DetailView()
            
            // 方法②
            DetailView(isPresented: self.$showingDetail)
            
        }
    }
}
//-----------------------------------