我有这个 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/

10-13 01:11