У меня есть такая простая галочка SwiftUI view. Он отображается в списке и может переключаться нажатием на него или переключаться при обновлении из источника данных (например, Core Data)
Моя первая реализация была
struct RoundedCheckmark: View {
@State var isChecked : Bool
let onCheck: (Bool) -> Void
func toggle() { isChecked = !isChecked; onCheck(isChecked) }
init(isChecked: Bool, onCheck: @escaping (Bool) -> Void = { _ in }) {
self._isChecked = State(initialValue: isChecked)
self.onCheck = onCheck
}
var body: some View {
Button(action: toggle) {
Image(isChecked ? "CheckedCheckmark" : "UncheckedCheckmark")
}
}
}
Это казалось, работает, я мог переключить его, и он загружается правильно. При переключении я сохранил изменения через закрытие / обратный вызов onCheck, и он обновился нормально.
Но после внешних обновлений, таких как pu sh, обновление базовых моделей в Базовых данных при обновлении sh этого представления неправильно изменяет свойство @State isChecked.
В init () я получаю новое значение isChecked и повторно инициализирую @State с State (initialValue:). Но в теле я получаю старое значение isChecked как из старого свойства @State. поэтому представление имеет неправильное изображение.
Это обходной путь, т. Е. Использование только свойства let isChecked и обратного вызова onCheck. Но теперь у меня не может быть состояния внутри моего View, и я должен полагаться только на изменение внешнего источника данных. Может быть, это более уместно, так как у меня есть один источник правды без локального хранилища @State.
struct RoundedCheckmark: View {
let isChecked: Bool
let onCheck: (Bool) -> Void
func toggle() { onCheck(isChecked) }
init(isChecked: Bool, onCheck: @escaping (Bool) -> Void = { _ in }) {
self.isChecked = isChecked
self.onCheck = onCheck
}
var body: some View {
Button(action: toggle) {
Image(isChecked ? "CheckedCheckmark" : "UncheckedCheckmark")
}
}
}