所以我有這個結構任務,它有一個@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)
}
}
uj5u.com熱心網友回復:
@State屬性包裝器并不打算在資料模型中使用,例如您的 struct Task 。@State屬性包裝器是用于 SwiftUI 視圖的屬性包裝器。如果你洗掉@State,你應該處于良好狀態。
uj5u.com熱心網友回復:
不要@State在外面使用,View就像你在里面一樣Task。它們只能在View.
解釋檔案@State非常有用: https://developer.apple.com/documentation/swiftui/state
“...您應該只從視圖主體內部或從它呼叫的方法訪問狀態屬性。因此,將您的狀態屬性宣告為私有,以防止您的視圖的客戶端訪問它們。從任何執行緒改變狀態屬性是安全的......“。
注意:Swift 也有一個Task結構體,它是一個異步作業單元。如果您對Task結構使用相同的名稱,這可能會成為一個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420327.html
標籤:
