【问题标题】:@State not updating in SwiftUI 2@State 未在 SwiftUI 2 中更新
【发布时间】:2020-10-21 06:52:04
【问题描述】:

有人看到@State 变量在 Xcode 12b 的 SwiftUI 2 中没有更新的问题吗?问题代码在 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)
            }
        })
    }
}

【问题讨论】:

  • 适用于 Xcode 12b。你会显示你的问题代码吗?
  • 是的,这是在 Xcode 12beta 中
  • 我也遇到过同样的问题——Xcode 12 beta 2 中也没有修复。
  • 我也有同样的问题
  • 我遇到了同样的问题,有人知道为什么它不起作用

标签: swiftui


【解决方案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) {
            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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多