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