自定义对象的 属性 更改时的状态
State when a property of a custom object changes
我有一个这样的对象(简化):
struct BoxModel: Codable, Identifiable, Hashable {
var id: Int
var number: Int
}
我有一个二维数组:
@State private var matrix = generate()
其中 generate 创建对象的二维数组:[[BoxModel]]。然后我将它们显示在网格中。网格非常复杂,但这里有一个非常简化的形式:
LazyVGrid(columns: columns, spacing: 0 ) {
ForEach(1...9, id: \.self) { j in
Text("\(getModel(j).number)")
}
}
其中 getValue 从数组中获取对应于网格位置的项目。由于网格很复杂,我需要在一个单独的函数中做一些算术运算。
下面是一个按钮。当用户点击它时,它会更改数组中对象之一的编号 属性。但是,数字不会更新。我认为它会因为数组是 @State 属性.
有没有办法让它更新?
这是 ContentView 的一个极其简化的形式:
struct ContentView: View {
@State private var matrix = generate()
var body: some View {
NavigationView {
GeometryReader { geometry in
ScrollView {
VStack {
let columns = [GridItem(.fixed(50), spacing: 0),
GridItem(.fixed(50), spacing: 0),
GridItem(.fixed(50), spacing: 0)]
LazyVGrid(columns: columns, spacing: 0 ) {
ForEach(1...9, id: \.self) { j in
Text("\(getModel(j).number)")
}
}
.padding()
Button {
var model = getModel(0)
model.number = 5
} label: {
Text("Click Me")
}
}
}
}
}
}
func getModel(_ i: Int) -> BoxModel {
// very simplified
return matrix[0][i]
}
总而言之,Button
闭包中的代码正在创建一个与 matrix
变量 different/not 相关的新对象。因此更新新对象不会影响 @State
变量。
更改 Button
操作闭包中的代码,来自:
var model = getModel(0)
model.number = 5
到
if let index = matrix[0].firstIndex(of: getModel(1)) {
matrix[0][index].number = 5
}
我们的目标是确保您 updating/changing @State
属性 本身。
我有一个这样的对象(简化):
struct BoxModel: Codable, Identifiable, Hashable {
var id: Int
var number: Int
}
我有一个二维数组:
@State private var matrix = generate()
其中 generate 创建对象的二维数组:[[BoxModel]]。然后我将它们显示在网格中。网格非常复杂,但这里有一个非常简化的形式:
LazyVGrid(columns: columns, spacing: 0 ) {
ForEach(1...9, id: \.self) { j in
Text("\(getModel(j).number)")
}
}
其中 getValue 从数组中获取对应于网格位置的项目。由于网格很复杂,我需要在一个单独的函数中做一些算术运算。
下面是一个按钮。当用户点击它时,它会更改数组中对象之一的编号 属性。但是,数字不会更新。我认为它会因为数组是 @State 属性.
有没有办法让它更新?
这是 ContentView 的一个极其简化的形式:
struct ContentView: View {
@State private var matrix = generate()
var body: some View {
NavigationView {
GeometryReader { geometry in
ScrollView {
VStack {
let columns = [GridItem(.fixed(50), spacing: 0),
GridItem(.fixed(50), spacing: 0),
GridItem(.fixed(50), spacing: 0)]
LazyVGrid(columns: columns, spacing: 0 ) {
ForEach(1...9, id: \.self) { j in
Text("\(getModel(j).number)")
}
}
.padding()
Button {
var model = getModel(0)
model.number = 5
} label: {
Text("Click Me")
}
}
}
}
}
}
func getModel(_ i: Int) -> BoxModel {
// very simplified
return matrix[0][i]
}
总而言之,Button
闭包中的代码正在创建一个与 matrix
变量 different/not 相关的新对象。因此更新新对象不会影响 @State
变量。
更改 Button
操作闭包中的代码,来自:
var model = getModel(0)
model.number = 5
到
if let index = matrix[0].firstIndex(of: getModel(1)) {
matrix[0][index].number = 5
}
我们的目标是确保您 updating/changing @State
属性 本身。