我有这个 ContentView 有两个不同的模态视图,所以我对两者都使用 sheet(isPresented:)
,但似乎只有最后一个被呈现。我怎么能解决这个问题?或者无法在 SwiftUI 的 View 上使用多个工作表?
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)。 最佳答案
UPD
从 Xcode 12.5.0 Beta 3 (2021 年 3 月 3 日)开始,这个问题不再有意义,因为现在可能有多个 .sheet(isPresented:)
或 0x2141 行中出现的代码很好。
尽管如此,我发现这个答案仍然有效,因为它很好地组织了工作表并使代码干净且更具可读性 - 你有一个事实来源而不是几个独立的 bool 值
实际答案
最好的方法,它也适用于 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:)要隐藏工作表,只需设置
.fullScreenCover(isPresented:)
奖金:如果您希望您的工作表全屏显示,请使用相同的代码,但不要使用
activeSheet = nil
写入 .sheet
关于swift - 多张(isPresented :) doesn't work in SwiftUI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58837007/