将一组 TextInputs 从子视图传递到父视图。迅捷

时间:2021-05-15 05:21:01

标签: swiftui

我有一个 AttackParameters 的父视图,它正在调用一个子视图 (MissileView)...我正在向 MissileView 发送三件事。 2 个数组,这使 Missile 视图足以创建基于这两个数组的网格,并且该网格是文本输入的网格,例如 Soduko。然后我传入一个名称数组,使其具有与网格相同的行数和列数。

                ForEach(missileSelections, id:\.self) { missile in
                    if showGreeting{
                        Text(missile).padding()
                        MissileView(launchPointCount: launchPointsSelections, targetCount: targetSelections, names: [[String]](repeating: [String](repeating: "", count: targetSelections.count), count: launchPointsSelections.count)).padding(.horizontal, 20)
                    }
                }
            }

正如你在上面看到的,我在那里调用 MissileView。

                GridStack(rows: launchPointCount.count, columns: targetCount.count) { row, col in
                    TextField("", text: $names[row][col]).border(Color.black, width: 0.5).background(Color.white).keyboardType(.decimalPad).onChange(of: names) 

以上是导弹视图类。它有一个二维文本输入数组,但我想在用户将文本放入文本输入网格后将该数组返回到父视图。我该怎么做?

1 个答案:

答案 0 :(得分:0)

要做到这一点,您需要这样的东西:

struct MissileView: View {
    @Binding var launchPointCount: [String]
    @Binding var targetCount: [String]
    @Binding var names: [[String]] 
    ...
    }

struct AttackParametersView: View {
    ....
    @State var names = [[String]]()
    ...
    
    MissileView(launchPointCount: $launchPointsSelections,
                targetCount: $targetSelections,
                names: $names))
    
    
    } 

在调用“MissileView(....)”之前的某处做:

        names = [[String]](repeating: [String](repeating: "", 
        count: targetSelections.count), 
        count: launchPointsSelections.count)

或者把它放在 MissileView 中,比如:

    .onAppear(perform: {
        names = [[String]](repeating: [String](repeating: "", count: targetCount.count), count: launchPointCount.count)
    })

编辑:

我无法为您完成所有代码,但是您的设置已经足够复杂 您应该考虑创建一个专用模型 保存系统状态,并将其用于每个“网格”所需的输入。

您传递的 ObservableObject 模型,例如:

class AttackParameters: ObservableObject {
    @Published var grids ....
    @Published var names ....
    ...
    
}

然后在 AttackParametersView 中使用它,在 MissileView 中类似:

@ObservedObject var attackParameters = AttackParameters()    

所以当你的 attackParameters 模型发生变化时,所有的视图都会知道它并相应地进行调整。