gpt4 book ai didi

swiftui - @State 未在 SwiftUI 2 中更新

转载 作者:行者123 更新时间:2023-12-03 14:53:02 27 4
gpt4 key购买 nike

有人在 Xcode 12b 的 SwiftUI 2 中看到 @State 变量没有更新的问题吗?问题代码在 contextMenu 按钮中。showSheet var 切换为 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)
}
})
}
}

最佳答案

为时已晚,但它将帮助面临相同问题的其他人。使用@Binding 变量代替@State。

struct CarListView: View {
@State var isPresented = false
@State var selectedCar: Car?

var body: some View {
Button(action: {
self.selectedCar = cars[selectedIndex]
self.isPresented.toggle()
}) {
Text("Test")
}
.sheet(isPresented: self.$isPresented) {
WorkoutDetails(workout: selectedCar)
}
}
}

struct CarDetailsView: View {
@Binding var selectedCar: Car?
// Set a Binding instead of the @State variable
// If you not pass @Binding then you will not get updated variable here

var body: some View {
VStack {
// your code
}
}
}

关于swiftui - @State 未在 SwiftUI 2 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62666415/

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