这个ContentView有两个不同的模态视图,所以我对两者都使用了sheet(isPresented:)
,但似乎只有最后一个会出现。我怎样才能解决这个问题?还是不可能在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)。
发布于 2020-07-30 21:44:43
UPD
从Xcode 12.5.0Beta3(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
发布于 2019-11-13 12:34:42
请尝试下面的代码
更新答案(iOS 14,Xcode 12)
enum ActiveSheet {
case first, second
var id: Int {
hashValue
}
}
struct ContentView: View {
@State private var showSheet = false
@State private var activeSheet: ActiveSheet? = .first
var body: some View {
NavigationView {
VStack(spacing: 20) {
Button("First modal view") {
self.showSheet = true
self.activeSheet = .first
}
Button ("Second modal view") {
self.showSheet = true
self.activeSheet = .second
}
}
.navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
.sheet(isPresented: $showSheet) {
if self.activeSheet == .first {
Text("First modal view")
}
else {
Text("Only the second modal view works!")
}
}
}
}
}
发布于 2020-01-13 23:31:35
还可以将工作表添加到放置在视图背景中的EmptyView中。这可以多次完成:
.background(EmptyView()
.sheet(isPresented: isPresented, content: content))
https://stackoverflow.com/questions/58837007
复制相似问题