@State 在 SwiftUI 2 中未更新

9

有人在 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)
            }
        })
    }
}

2
在Xcode 12b上运行良好。您能展示一下出现问题的代码吗? - Asperi
我一直遇到同样的问题——在Xcode 12 beta 2中也没有解决。 - Kevin Olmats
我遇到了同样的问题。 - miguel.de.icaza
我遇到了同样的问题,有人找出为什么它不起作用了吗? - Sarvad
我遇到了类似的问题。有没有解决方法? - RXP
显示剩余2条评论
1个回答

1

虽然已经晚了,但这对于遇到相同问题的其他人会有所帮助。请使用@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) {
            CarDetailsView(selectedCar: 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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接