假设我在NavigationView中有一个视图,带有前导和尾随按钮。 因为我可以从这个视图呈现两个不同的sheet,所以我使用了这样的枚举:
enum AccountActiveSheet {
case about, settings
}
这个主视图中有两个 @State 属性,用于触发 sheet 的呈现。
@State private var isSheetPresented: Bool = false
@State private var activeSheet: AccountActiveSheet = .about
每个按钮都可以触发一个工作表。
var aboutButton: some View {
Button(action: {
self.activeSheet = .about
self.isSheetPresented.toggle()
}, label: {
Image(systemName: "info.circle.fill")
})
}
在导航视图的末尾,我选择正确的工作表进行呈现,就像这样。
.sheet(isPresented: $isSheetPresented) {
self.activeSheet.sheet
}
它在模态视图中运行良好并呈现正确的视图。
但是,我还有多个子视图在此主视图中,当点击按钮时可以呈现出sheet。 在这种情况下,由子视图管理的sheet(即跟踪$isSheetPresented变量+由子视图提供的sheet内容)未被呈现。 没有任何反应。 看起来父视图的sheet修饰符正在阻止子视图呈现sheet。
是否可能让父视图和子视图都管理sheet的显示?
enum AccountActiveSheet {
case about, settings
@ViewBuilder
var sheet: some View {
switch self {
case .about: Text("About")
case .settings: Text("Settings")
}
}
}
struct AccountView: View {
@State private var isSheetPresented: Bool = false
@State private var activeSheet: AccountActiveSheet = .about
var aboutButton: some View {
Button(action: {
self.activeSheet = .about
self.isSheetPresented.toggle()
}, label: {
Image(systemName: "info.circle.fill")
})
}
var settingsButton: some View {
Button(action: {
self.activeSheet = .settings
self.isSheetPresented.toggle()
}, label: {
Image(systemName: "gearshape.fill")
})
}
var body: some View {
NavigationView {
VStack {
Subview()
}
.navigationBarTitle("Account", displayMode: .inline)
.navigationBarItems(leading: aboutButton, trailing: settingsButton)
.sheet(isPresented: $isSheetPresented) {
self.activeSheet.sheet
}
}
}
}
struct Subview: View {
@State var isSheetPresented: Bool = false
var body: some View {
Button("Present sheet") {
self.isSheetPresented.toggle()
}
.sheet(isPresented: $isSheetPresented) {
Text("Subview")
}
}
}