1. ホーム
  2. swift

[解決済み] SwiftUIで複数のシート(isPresented:)が機能しない。

2022-06-11 13:35:50

質問

この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)。

どのように解決するのですか?

アップロード

からスタート Xcode 12.5.0 ベータ 3 (2021年3月3日)からは、この質問は意味を成さなくなりました。 .sheet(isPresented:) または .fullScreenCover(isPresented:) を並べると、質問で提示されたコードはうまく動作します。

とはいえ、私はこの回答がまだ有効だと思います。なぜなら、シートを非常にうまく整理し、コードをきれいに、ずっと読みやすくしているからです。

実際の回答

最適な方法、それは次のような場合にも有効です。 iOS 14 :

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