SwiftUI中TextField绑定VM属性出现每帧多次更新警告如何处理
问题解答
警告成因
你遇到的警告是SwiftUI状态同步机制的冲突导致的:ObservableObject 类型的实例通过 @StateObject 挂载到视图树上时,默认只有被 @Published 修饰的属性变更时,才会通过 objectWillChange 发送通知,和视图的渲染节奏对齐。
你直接用 $loginVM.username 生成的系统默认双向绑定,在输入修改属性值时,因为属性没有 @Published 修饰,也没有手动触发状态变更通知,系统无法确认状态是否同步完成,就会反复尝试发起更新操作,最终触发「每帧多次更新」的提示。
是否应该使用@Published
你可以根据自己的业务场景选择方案,不存在绝对的对错:
- 如果确实不需要username/password变更后触发任何视图更新,完全可以不用@Published。只需要把系统自动生成的Binding替换为自定义Binding即可,既不会触发警告也不会导致body重绘,示例代码如下:
TextField("User name", text: Binding( get: { loginVM.username }, set: { loginVM.username = $0 } )) // 密码输入框同理替换即可
- 如果你认为自定义Binding的冗余代码没必要,也可以直接加@Published修饰。即使每次输入都会触发body重绘,SwiftUI内置的差异渲染机制会自动跳过没有实际变化的视图节点,对于只有少量输入控件的页面来说,性能损耗几乎可以忽略,不会影响使用体验。
内容的提问来源于stack exchange,提问作者Mary Doe
相关产品推荐
相关产品推荐

