我有一个 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)
以上是导弹视图类。它有一个二维文本输入数组,但我想在用户将文本放入文本输入网格后将该数组返回到父视图。我该怎么做?
答案 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 模型发生变化时,所有的视图都会知道它并相应地进行调整。