【发布时间】:2021-03-15 23:43:42
【问题描述】:
我正在尝试在导航栏中选择菜单项时显示模式表。但是,工作表不显示。在调试时,我注意到状态变量 showSheet 没有得到更新,我有点不知道为什么它没有更新。
非常感谢任何帮助。谢谢!
另一个帖子 (@State not updating in SwiftUI 2) 也有类似的问题。这是 SwiftUI 中的错误吗?
以下是完整示例
我有一个fileprivate enum,它为视图定义了两种情况 - add 和 edit
fileprivate enum SheetView {
case add, edit
}
下面是内容视图。 ContentView 声明了两个 @State 变量,这些变量是根据所选菜单项设置的
菜单项 (var actionItems) 位于 NavigationView 上,并具有带有 2 个按钮的菜单 - 添加和编辑。每个按钮都有一个动作集来切换showSheetView 和showSheet 变量。根据选择的项目来呈现内容。内容是使用@ViewBuilder构建的
struct ContentView: View {
@State private var showSheetView = false
@State private var showSheet: SheetView? = nil
var body: some View {
GeometryReader { g in
NavigationView {
Text("Main Page")
.padding()
.navigationBarTitle("Main Page")
.navigationBarItems(trailing: actionItems)
}
}.sheet(isPresented: $showSheetView) {
content
}
}
var actionItems: some View {
Menu {
Button(action: {
showSheet = .add
showSheetView.toggle()
}) {
Label("Add Asset", systemImage: "plus")
}
Button(action: {
showSheet = .edit
showSheetView.toggle()
}) {
Label("Edit Asset", systemImage: "minus")
}
} label: {
Image(systemName: "dot.circle.and.cursorarrow").resizable()
}
}
@ViewBuilder
var content: some View {
if let currentView = showSheet {
switch currentView {
case .add:
AddAsset(showSheetView: $showSheetView)
case .edit:
EditAsset(showSheetView: $showSheetView)
}
}
}
}
以下是两个视图 - AddAsset 和 EditAsset
struct AddAsset: View {
@Binding var showSheetView: Bool
var body: some View {
NavigationView {
Text("Add Asset")
.navigationBarTitle(Text("Add"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
print("Dismissing sheet view...")
self.showSheetView = false
}) {
Text("Done").bold()
})
}
}
}
struct EditAsset: View {
@Binding var showSheetView: Bool
var body: some View {
NavigationView {
Text("Edit Asset")
.navigationBarTitle(Text("Edit"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
print("Dismissing sheet view...")
self.showSheetView = false
}) {
Text("Done").bold()
})
}
}
}
【问题讨论】: