You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:18:02