SwiftUI @State变量传递问题:类提醒App列表选中项编辑页无数据
问题根源
你遇到的编辑页数据不展示问题核心是3处逻辑缺失:
- 跳转编辑页时没有携带选中的列表条目数据
- 编辑页未定义接收条目数据的参数,也没有将传入的数据绑定到内部输入控件
- 编辑页的设备选择器用了空的自定义数据源,导致配置项无法加载
修复步骤
1. 修改DotView的枚举与跳转逻辑,支持传递选中条目
修改ActiveSheet枚举,新增关联值携带选中的DotItem,同时新增选中条目存储变量,修改列表点击逻辑:
struct DotView: View { // 原有代码不变 enum ActiveSheet: Identifiable { case SwiftUIView case EditView(DotItem) // 新增关联值携带选中条目 var id: String { switch self { case .SwiftUIView: return "SwiftUIView" case .EditView(let item): return "EditView_\(item.dotId)" } } } // 新增选中条目存储变量 @State var selectedDotItem: DotItem? = nil // 原有其他@State变量不变 var body: some View { // 外层布局原有代码不变 List { ForEach(listViewModel.dotitems, id:\.dotId){ dotitem in Button(action: { self.selectedDotItem = dotitem self.activeSheet = .EditView(dotitem) // 跳转时传入选中条目 }, label: { DotItemListView(dotitem: dotitem) }) } // 原有onDelete、onMove逻辑不变 } // 原有列表样式代码不变 .sheet(item: $activeSheet){ sheet in switch sheet { case .SwiftUIView: // 原有新增页初始化不变 SwiftUIView(dotName: dotName, dotNumber: dotNumber, selection: selection, triggerSelection: triggerSelection, searchText: searchText, plugUsername: plugUsername, plugPassword: plugPassword, show: $show) case .EditView(let dotItem): // 编辑页初始化传入选中条目 EditView(editItem: dotItem, show:$show) } } }
2. 修改EditView,支持接收并加载条目数据
新增编辑条目参数,在页面加载时将数据赋值给内部输入变量,同时修复选择器数据源问题:
struct EditView: View { @Environment(\.presentationMode) var presentationMode @EnvironmentObject var listViewModel: ListViewModel @ObservedObject var vm = getDeviceNames() // 删掉原来的@State var dataSet = [Result]() 这个空变量 // 新增编辑条目接收参数 let editItem: DotItem @State var dotName:String = "" @State var dotNumber:String = "" @State var selection:String = "" // 其他原有State变量不变 @Binding var show : Bool // 页面加载时赋值数据 .onAppear { dotName = editItem.dotName dotNumber = editItem.dotNumber selection = editItem.selection } var body: some View { NavigationView { Form { Section(header: Text("Info")) { // 修复TextField的placeholder,和新增页保持一致 TextField("Name", text: $dotName) TextField("Number", text: $dotNumber) Picker(selection: $selection, label: Text("Discover Plug")) { // 选择器数据源改成vm.dataSet,不要用空的dataSet ForEach(vm.dataSet, id:\.self) { item in Text(item.Device).tag(item.Device) } } // 原有其他表单逻辑不变 } // 原有其他Section逻辑不变 } // 原有导航栏配置不变 } }
3. 可选补充:新增编辑保存逻辑
现在你还缺少编辑后保存的逻辑,可先在ListViewModel中新增更新条目方法:
extension ListViewModel { func updateItem(itemId: String, newName: String, newNumber: String, newSelection: String) { guard let index = dotitems.firstIndex(where: { $0.dotId == itemId }) else { return } dotitems[index] = DotItem(dotId: itemId, dotName: newName, dotNumber: newNumber, selection: newSelection) } }
之后在EditView的导航栏新增保存按钮,点击时调用上述updateItem方法即可完成编辑保存。
内容的提问来源于stack exchange,提问作者Lloyd English
相关产品推荐
相关产品推荐

