SwiftUIで複数のシート(isPresented:)が機能しない 質問する

SwiftUIで複数のシート(isPresented:)が機能しない 質問する

この ContentView には 2 つの異なるモーダル ビューがあり、sheet(isPresented:)両方に使用していますが、最後の 1 つだけが表示されるようです。どうすればこの問題を解決できますか? または、SwiftUI のビューで複数のシートを使用することはできませんか?

struct ContentView: View {
    
    @State private var firstIsPresented = false
    @State private var secondIsPresented = false
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.firstIsPresented.toggle()
                }
                Button ("Second modal view") {
                    self.secondIsPresented.toggle()
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $firstIsPresented) {
                    Text("First modal view")
            }
            .sheet(isPresented: $secondIsPresented) {
                    Text("Only the second modal view works!")
            }
        }
    }
}

上記のコードは警告なしでコンパイルされます (Xcode 11.2.1)。

ベストアンサー1

上院

から始まるXcode 12.5.0 ベータ 3.sheet(isPresented:)(2021 年 3 月 3 日) この質問は、複数または.fullScreenCover(isPresented:)連続して使用することが可能になり、質問で提示されたコードが問題なく機能するため、もはや意味がありません。

それでも、この回答はシートを非常にうまく整理し、コードをクリーンで読みやすくするため、依然として有効だと思います。独立したブール値の代わりに、1つの真実のソースがあります。

実際の答え

最も良い方法は、iOS14 アップデート:

enum ActiveSheet: Identifiable {
    case first, second
    
    var id: Int {
        hashValue
    }
}

struct YourView: View {
    @State var activeSheet: ActiveSheet?

    var body: some View {
        VStack {
            Button {
                activeSheet = .first
            } label: {
                Text("Activate first sheet")
            }

            Button {
                activeSheet = .second
            } label: {
                Text("Activate second sheet")
            }
        }
        .sheet(item: $activeSheet) { item in
            switch item {
            case .first:
                FirstView()
            case .second:
                SecondView()
            }
        }
    }
}

詳細はこちらをご覧ください:https://developer.apple.com/documentation/swiftui/view/sheet(item:ondismiss:content:)

シートを非表示にするには、activeSheet = nil

ボーナス:シートをフルスクリーンにしたい場合は、まったく同じコードを使用しますが、次のように.sheet書く代わりに.fullScreenCover

おすすめ記事