У меня есть ObservableObject, который должен содержать состояние моего приложения:
final class Store: ObservableObject {
@Published var fetchInterval = 30
}
Теперь этот объект внедряется в root моей иерархии, а затем в какой-то компонент вниз по дереву. пытаюсь получить к нему доступ и привязать его к TextField, а именно:
struct ConfigurationView: View {
@EnvironmnetObject var store: Store
var body: some View {
TextField("Fetch interval", $store.fetchInterval, formatter: NumberFormatter())
Text("\(store.fetchInterval)"
}
}
- Несмотря на то, что переменная связана (с
$
), свойство не обновляется, начальное значение отображается правильно, но когда я изменяю его, текстовое поле изменяется, но привязка не распространяется - Относительно первого вопроса: как я получу событие после изменения значения, я попробовал следующий фрагмент, но ничего не запускается (я полагаю, потому что текстовое поле неправильно привязано ...
$fetchInterval
.debounce(for: 0.8, scheduler: RunLoop.main)
.removeDuplicates()
.sink { interval in
print("sink from my code \(interval)")
}
Любая помощь очень ценится.
Редактировать: я только что обнаружил, что для текста переменных, привязка отлично работает из коробки, например:
// on store
@Published var testString = "ropo"
// on component
TextField("Ropo", text: $store.testString)
Text("\(store.testString)")
только в поле int, она не обновляет переменную правильно
Edit 2: Ok I только что обнаружили, что недостаточно только изменить поле, нужно нажать Enter
, чтобы изменение распространялось, а это не то, чего я хочу, я хочу, чтобы изменения распространялись каждый раз, когда поле изменяется ...