所以我有一个结构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
结构使用相同的名称。