有人在 Xcode 12b 中使用 SwiftUI 2 时遇到 @State 变量不更新的问题吗?问题代码位于 contextMenu 按钮中。
showSheet
变量被切换为 true,但 sheetItem
的值没有改变。这段代码在 SwiftUI 1 中是有效的。
我已经提交了反馈,但想知道是否还有其他人遇到了这个问题。
完整代码:
struct ConnectionsView: View {
@EnvironmentObject var connectionViewModel : FileDataViewModel<Connection>
@State private var editMode = EditMode.inactive
@State private var importedConnections = false
@State private var showEditSheet = false
@State private var selectedIndex = 0
@State private var showSheet = false
@State private var sheetItem = SheetItem.openFile //TOD: Set back to .none when ButtonActions fixed
@State private var newConnection = Connection()
var body : some View {
NavigationView {
List {
ForEach(connectionViewModel.items) { connection in
NavigationLink (destination: SSHSessionView (connection: connection)) {
ConnectionView(connection: connection)
//pass tap through the view to allow the NavigationLink to work
.allowsHitTesting(self.editMode == .inactive ? false : true)
.onTapGesture {
if self.editMode.isEditing {
self.selectedIndex = self.connectionViewModel.items.firstIndex(where: {$0.id == connection.id})!
self.sheetItem = .editItem
self.showSheet.toggle()
}
}
}
}
.onDelete(perform: deleteItem)
.onMove(perform: moveItem)
}
.onAppear {
UITableView.appearance().tableFooterView = UIView()
}
.navigationBarTitle("Connections", displayMode: .large)
.navigationBarItems(
leading:
EditButton()
.hoverWithPaddingModifier(),
trailing:
Button(action: {
}, label: {
Image(systemName: "plus")
})
.contextMenu {
Button("New Connections file...", action: {
sheetItem = .newFile
showSheet.toggle()
})
Button("Open Connections file...", action: {
sheetItem = .openFile
showSheet = true
})
if connectionViewModel.fileOpened {
Button("New Connection", action: {
sheetItem = .newItem
showSheet.toggle()
})
}
}
)
.environment(\.editMode, $editMode)
.sheet(isPresented: $showSheet, content: {
if self.sheetItem == .editItem {
AddEditConnectionView (connection: self.$connectionViewModel.items[self.selectedIndex], newConnection: false)
.environmentObject(self.connectionViewModel)
}
if self.sheetItem == .newFile {
FilePickerView(callback : self.importedConnections == false ? self.pickedDocuments : self.newDocFromServerList, UTIs : connectionUTIs, newFileURL : FileDataViewModel<Connection>.getBlankFile (fileType : ViewTypes.connections)!)
}
if self.sheetItem == .openFile {
FilePickerView(callback : self.pickedDocuments, UTIs : connectionUTIs, newFileURL: nil)
}
if self.sheetItem == .newItem {
AddEditConnectionView (connection: self.$newConnection, newConnection: true)
.environmentObject(self.connectionViewModel)
}
})
}
}