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

如何将数组中的Binding对象传递给SwiftUI视图?

SwiftUI 提取带双向绑定的子视图方案

首先修正你原代码里的一个编译错误:MyObject初始化方法中,self.name = varName应该改为self.name = name,否则会因未定义varName报错。

你的需求是将操作MyObject属性的两个TextField提取为独立子视图,核心是正确传递绑定类型参数,保证子视图的修改能同步回原数组。下面提供两种实现方案:

方案一:传递整个对象的绑定(推荐,简洁高效)

1. 修正数据模型

struct MyObject: Hashable, Identifiable {
    let id: UUID = UUID()
    var name, brand: String
    
    init(name: String = "", brand: String = "") {
        self.name = name // 修正原代码错误
        self.brand = brand
    }
}

final class Model: ObservableObject {
    @Published var objects = (0..<3).compactMap { _ in MyObject() }
}

2. 提取子视图

创建接受Binding<MyObject>的子视图,直接通过绑定访问对象属性:

struct ObjectEditorView: View {
    // 声明绑定类型的对象参数
    @Binding var object: MyObject
    
    var body: some View {
        VStack(spacing: 8) {
            TextField(object.name, text: $object.name, prompt: Text("name"))
                .textFieldStyle(.roundedBorder)
            TextField(object.brand, text: $object.brand, prompt: Text("brand"))
                .textFieldStyle(.roundedBorder)
        }
    }
}

3. 修改主视图调用子视图

在ForEach中直接传递解构出的对象绑定:

struct ContentView: View {
    private let columns = [GridItem(.flexible()), GridItem(.flexible())]
    @StateObject private var model = Model()
    
    var body: some View {
        VStack{
            LazyVGrid(
                columns: columns,
                alignment: .center,
                spacing: 10,
                pinnedViews: []
            ) {
                // 从绑定数组中解构出单个对象的绑定
                ForEach($model.objects) { $object in
                    ObjectEditorView(object: $object)
                }
            }
        }
        .padding(20)
    }
}

方案二:传递单个属性的绑定(灵活适配局部场景)

如果不需要传递整个对象,可以单独传递每个属性的绑定:

子视图定义

struct ObjectEditorView: View {
    @Binding var name: String
    @Binding var brand: String
    
    var body: some View {
        VStack(spacing: 8) {
            TextField(name, text: $name, prompt: Text("name"))
                .textFieldStyle(.roundedBorder)
            TextField(brand, text: $brand, prompt: Text("brand"))
                .textFieldStyle(.roundedBorder)
        }
    }
}

主视图调用

ForEach($model.objects) { $object in
    ObjectEditorView(
        name: $object.name,
        brand: $object.brand
    )
}

核心逻辑说明

  • @Binding类型参数用于在父视图和子视图之间建立双向数据连接,子视图对绑定值的修改会直接同步回父视图的数据源(这里就是model.objects数组)。
  • 当使用ForEach($model.objects)时,SwiftUI会自动将数组中的每个元素包装为Binding<MyObject>,通过$object解构即可直接使用。

内容的提问来源于stack exchange,提问作者Duck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:50