【发布时间】:2021-10-17 20:57:05
【问题描述】:
我在 SwiftUI 中有一个视图,我希望它在模型中的变量发生变化时重绘和运行闭包。我正在使用这个闭包来更新我存储在视图中的状态变量,它应该是模型中变量在它改变之前的先前值
下面的代码模拟了我的情况:
let viewModel = ViewModel()
struct someView: View {
@observedObject var viewModel: ViewModel = viewModel
@State var previousSomeValue: CGFloat = 0
var body: some View {
Text("\(viewModel.model.someValue)")
}
}
class ViewModel: ObservableObject {
@Published var model = Model()
}
struct model {
var someValue: CGFloat = 0
}
使用此设置,如果 someValue 发生更改, someView 会重绘,但是,我无法触发闭包。
//我尝试过的解决方案:
主要是将onChangeOf(_ (T)->Void)附加到我的视图中。使用.onChangeOf( viewModel.model.someValue ) { _ in //do something },我可以在闭包发生变化时触发闭包,但是当它运行时,viewModel.model.someValue 已经更新为 newValue,而我无法捕获旧的闭包。我在文档中读到这是设计使然,您必须捕获要存储其旧值的东西,但我(据我所知)只能捕获 self、viewModel,但不能捕获 viewModel.model.someValue。
.onChangeOf( viewModel.model.someValue ) { [self] newValue in //do something } //works but doesnt capture the var
.onChangeOf( viewModel.model.someValue ) { [viewModel] newValue in //do something } //works but doesnt capture the var
.onChangeOf( viewModel.model.someValue ) { [viewModel.model.someValue] newValue in //do something } //does not compile ( Expected 'weak', 'unowned', or no specifier in capture list )
我也尝试在视图中创建一个绑定,例如 Binding { gameView.model.someValue } set: { _ in } 并让 onChange 观察者改为 this,但即使我捕获自我,当调用闭包时,旧值和新值是相同的。
这似乎是一件很常见的事情(检测外部变化并触发闭包),我应该怎么做?
【问题讨论】:
-
是的,这是很常见的事情,在这里您可以了解如何操作:developer.apple.com/documentation/swiftui/…
-
谢谢,这与经过认证的答案一起非常有帮助
标签: swift swiftui binding state