Estou exibindo uma lista de verificação que permite ao usuário ativar e desativar opções:
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
}
Isso funciona bem. No entanto, a lista de verificação é um SwiftData @Model que possui um método para redefinir a lista de verificação:
func reset() {
for item in self.items {
item.isChecked = false
}
}
E chamar essa função faz com que a checklistChanged()
função, na minha opinião, seja chamada (várias vezes) porque a isChecked
propriedade está sendo alterada em todos os itens. Eu só quero que a checklistChanged()
função seja chamada especificamente quando um usuário toca e altera o valor de uma caixa de seleção. Como posso separar essas preocupações? Tentei usar onTapGesture
em vez de onChange
alternar, mas não foi chamado.
Não há como saber a diferença entre a
Toggle
mudançaisChecked
e a mudança do seu códigoisChecked
. Você precisa de algumas informações extras para indicar quem o alterou.A maneira mais simples é apenas adicionar uma
@Transient
propriedade ao seu modelo, para indicar seisChecked
foi alterado programaticamente.Se precisar aumentar isso para todas as propriedades do seu modelo, você pode escrever uma macro de membro anexada à sua
@Model
classe para gerá-las.Você pode definir isso em
reset
:Então você pode verificar esse sinalizador em
onChange
: