我正在显示一个清单,允许用户检查打开和关闭的选项:
ForEach(checklist.items.sorted(by: { $0.sortOrder < $1.sortOrder })) { item in
@Bindable var item = item
Toggle(item.title, isOn: $item.isChecked)
.toggleStyle(CheckboxToggleStyle())
.onChange(of: item.isChecked) { newValue in
checklistChanged()
}
}
func checklistChanged() {
//check some things and update other parts of the UI
}
这很好用。然而,清单是一个 SwiftData @Model,它有一个重置清单的方法:
func reset() {
for item in self.items {
item.isChecked = false
}
}
调用此函数会导致checklistChanged()
我认为该函数被调用(多次),因为isChecked
所有项目的属性都在更改。我只希望checklistChanged()
当用户点击并更改复选框值时专门调用该函数。我怎样才能区分这些问题?我尝试使用onTapGesture
而不是onChange
在切换上,但没有被调用。
没有办法区分
Toggle
更改isChecked
与代码更改之间的区别isChecked
。您需要一些额外的信息来表明是谁更改了它。@Transient
最简单的方法是向模型添加一个属性,以指示是否isChecked
已以编程方式更改。如果您需要针对模型中的所有属性进行扩展,您可以编写一个附加到您的
@Model
类的成员宏来生成这些属性。您可以在以下位置进行设置
reset
:然后您可以在以下位置检查此标志
onChange
: