我有以下在Swift/Swift in中复制的例子。
预期功能:数字列表,在删除任何数字时,数字会更新和重新组织,以使它们按顺序排列。
例如:假设我们有一个列表中的数字1,2,3,4。当我们删除2号时,列表应该变成1,2,3,而不是停留在1,3,4。
问题:当@State用于保存数字数组时,代码按预期工作。但是,当@AppStorage中的数组用于保存数组时,视图似乎不更新/更改数字。
那么,为什么我不能使用@AppStorage方法,以及如何解决这个问题呢?
--我知道这段代码看上去很像,但是如果你只看注释的话,你可以忽略它。它只是一个有几个功能的身体,没什么疯狂的。
class MyObj: Codable, Identifiable { //SIMPLE OBJECT TO HOLD A NUMBER
init(num: Int) {
self.num = num
}
var id: UUID = UUID()
var num: Int
}
struct test2: View {
@State var array: [MyObj] = [] //USING THIS (@State) WORKS
//AppStorage("array") var array: [MyObj] = [] //USING THIS (@AppStorage) DOESN’T UPDATE NUMBERS
func minimizeNums() {
for i in 0..<array.count { //MAKES NUMBERS IN ORDER/CONSECUTIVE
array[i].num = i
}
}
var body: some View {
VStack {
Button("add number object") {
array.append(MyObj(num: array.count))
}
List {
ForEach(array) { obj in
Text(String(obj.num))
}
.onDelete(perform: { index in
array.remove(atOffsets: index) //REMOVES NUMBER OBJECT FROM LIST
minimizeNums() //MAKES THE REMAINING OBJECT'S NUMBERS CONSECUTIVE
})
}
}
}
}重要:--我使用了来自这接受答案的扩展来将数组存储在@AppStorage中。我想这个扩展可能是造成问题的原因,但我不确定是怎么回事!
发布于 2022-04-26 10:12:04
这是失败的,因为您正在为您的模型MyObj使用一个类。在SwiftUI中使用结构有多种原因。请阅读博客条目或任何其他教程或文档。
TLDR:不要使用类,使用结构。
将MyObj更改为:
struct MyObj: Codable, Identifiable {
init(num: Int) {
self.num = num
}
var id: UUID = UUID()
var num: Int
}应该行得通。
https://stackoverflow.com/questions/72010525
复制相似问题