实例的状态没有更新--SwiftUI



所以我有一个结构Task,它有一个@State完成:

struct Task:Identifiable{
var id: Int
@State var completion:Bool = false
var priority:String? = nil
@State var completionDate:Date? = nil
var creationDate:Date
var fullDescription:String
}

在TaskItem:View中,我正在尝试制作一个复选框,以正确更新状态:

struct TaskItem: View {

@State var task:Task
@State var isChecked:Bool = false

func toggle(){
isChecked = !isChecked
task.completion = isChecked
if isChecked {
task.completionDate = Date()
} else {
task.completionDate = nil
}
}

var body: some View {

Button(action: toggle){

Image(systemName: isChecked ? "square.split.diagonal.2x2": "square")




}

}
}

但是,即使isChecked和图像都发生了更改,task.completion也没有。我该怎么解决这个问题?

我目前正在使用这个来查看它:

struct TaskItem_Previews: PreviewProvider {
static var previews: some View {
let task =  testTask()
TaskItem(task: task)
}
}

@State属性包装器不应该在数据模型中使用,就像结构Task一样。@State属性包装器是用于SwiftUI视图的属性包装器。如果你去掉@State,你的状态应该很好。

不要像在Task中那样在View之外使用@State。它们只能在View内部使用。

解释@State的文档非常有用:

"。。。您应该只从视图主体内部或从其调用的方法访问状态属性。因此,请将您的状态属性声明为私有属性,以防止视图的客户端访问它们。从任何线程更改状态属性都是安全的&";。

注意:Swift还有一个Task结构,它是异步工作的一个单元。这可能会成为一个问题如果对Task结构使用相同的名称。

最新更新