gpt4 book ai didi

swift - 多张纸(isPresented :) doesn't work in SwiftUI

转载 作者:行者123 更新时间:2023-11-28 05:35:24 25 4
gpt4 key购买 nike

我的 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)。

最佳答案

更新

Xcode 12.5.0 Beta 3(2021 年 3 月 3 日)开始,这个问题不再有意义,因为现在可以有多个 .sheet(isPresented:).fullScreenCover(isPresented:) 一行,问题中提供的代码将正常工作。

尽管如此,我发现这个答案仍然有效,因为它很好地组织了工作表并使代码干净且更具可读性 - 你有一个真实来源而不是几个独立的 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:)

要隐藏工作表,只需设置 activeSheet = nil

奖励:如果你想让你的工作表全屏,那么使用完全相同的代码,但不是 .sheet.fullScreenCover

关于swift - 多张纸(isPresented :) doesn't work in SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com