Osc*_*nco 3 macos ios swift swiftui combine
我有一个 ObservableObject 应该保存我的应用程序状态:
final class Store: ObservableObject {
@Published var fetchInterval = 30
}
Run Code Online (Sandbox Code Playgroud)
现在,该对象被注入到我的层次结构的根部,然后在树下的某个组件中,我尝试访问它并将其绑定到 TextField,即:
struct ConfigurationView: View {
@EnvironmnetObject var store: Store
var body: some View {
TextField("Fetch interval", $store.fetchInterval, formatter: NumberFormatter())
Text("\(store.fetchInterval)"
}
}
Run Code Online (Sandbox Code Playgroud)
$
),属性也不会被更新,初始值会正确显示,但是当我更改它时,文本字段会发生变化,但绑定不会传播$fetchInterval
.debounce(for: 0.8, scheduler: RunLoop.main)
.removeDuplicates()
.sink { interval in
print("sink from my code \(interval)")
}
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢。
编辑:我刚刚发现对于文本变量,绑定开箱即用,效果很好,例如:
// on store
@Published var testString = "ropo"
// on component
TextField("Ropo", text: $store.testString)
Text("\(store.testString)")
Run Code Online (Sandbox Code Playgroud)
仅在 int 字段上它没有正确更新变量
编辑2:好的,我刚刚发现仅更改字段是不够的,必须按下Enter
才能传播更改,这不是我想要的,我希望每次更改字段时都会传播更改......
对于任何感兴趣的人,这是我最终得到的解决方案:
TextField("Seconds", text: Binding(
get: { String(self.store.fetchInterval) },
set: { self.store.fetchInterval = Int($0.filter { "0123456789".contains($0) }) ?? self.store.fetchInterval }
))
Run Code Online (Sandbox Code Playgroud)
添加无效字符时会有一点延迟,但这是最干净的解决方案,它不允许无效字符,而无需重置 TextField 的状态。
它还会立即提交更改,而无需等待用户按 Enter 键或无需等待字段模糊。
归档时间: |
|
查看次数: |
1814 次 |
最近记录: |