@AppStorage 不更新视图
@AppStorage not updating view
我在 Swift/SwiftUI.
中有以下复制示例
预期功能: 号码列表,删除任何号码后,号码会更新并重新排列,以便它们按连续顺序排列。
示例:假设我们在列表中有数字 1、2、3、4。当我们删除数字 2 时,列表应该变成 1, 2, 3 而不是像 1, 3, 4 一样。
问题: 当 @State
用于保存数字数组时,代码按预期工作。但是,当@AppStorage
中的数组用于保存数组时,视图似乎没有update/change数字。
那么,为什么我不能使用 @AppStorage
方法,我该如何解决这个问题?
我知道代码看起来很多,但是如果你只看评论,你基本上可以忽略它。它只是一个具有几个功能的 body,没什么特别的。
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
中。我认为此扩展程序可能是导致问题的原因,但我不确定是如何造成的!
这是失败的,因为您正在为您的模型 MyObj
使用 class。使用具有 SwiftUI
的结构有多种原因。请阅读 Blog entry 或任何其他教程或文档。
[TLDR]:
不要使用 class 而是使用结构。
将 MyObj
更改为:
struct MyObj: Codable, Identifiable {
init(num: Int) {
self.num = num
}
var id: UUID = UUID()
var num: Int
}
应该可以。
我在 Swift/SwiftUI.
中有以下复制示例预期功能: 号码列表,删除任何号码后,号码会更新并重新排列,以便它们按连续顺序排列。
示例:假设我们在列表中有数字 1、2、3、4。当我们删除数字 2 时,列表应该变成 1, 2, 3 而不是像 1, 3, 4 一样。
问题: 当 @State
用于保存数字数组时,代码按预期工作。但是,当@AppStorage
中的数组用于保存数组时,视图似乎没有update/change数字。
那么,为什么我不能使用 @AppStorage
方法,我该如何解决这个问题?
我知道代码看起来很多,但是如果你只看评论,你基本上可以忽略它。它只是一个具有几个功能的 body,没什么特别的。
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
中。我认为此扩展程序可能是导致问题的原因,但我不确定是如何造成的!
这是失败的,因为您正在为您的模型 MyObj
使用 class。使用具有 SwiftUI
的结构有多种原因。请阅读 Blog entry 或任何其他教程或文档。
[TLDR]: 不要使用 class 而是使用结构。
将 MyObj
更改为:
struct MyObj: Codable, Identifiable {
init(num: Int) {
self.num = num
}
var id: UUID = UUID()
var num: Int
}
应该可以。