gpt4 book ai didi

ios - 在 SwiftUI View 中结合 onChange 和 onAppear 事件?

转载 作者:行者123 更新时间:2023-12-04 02:30:43 25 4
gpt4 key购买 nike

我正在使用 onChange 观察 View 上的属性修饰符。但是,我也希望在初始值上运行同一段代码,因为有时数据会注入(inject)到初始化程序中或稍后异步加载。
例如,我有一个注入(inject)模型的 View 。有时,此模型中开始包含数据(如预览),或者从网络异步检索。

class MyModel: ObservableObject {
@Published var counter = 0
}

struct ContentView: View {
@ObservedObject var model: MyModel

var body: some View {
VStack {
Text("Counter: \(model.counter)")
Button("Increment") { model.counter += 1 }
}
.onChange(of: model.counter, perform: someLogic)
.onAppear { someLogic(counter: model.counter) }
}

private func someLogic(counter: Int) {
print("onAppear: \(counter)")
}
}
在这两个 onAppearonChange情况下,我想运行 someLogic(counter:) .有没有更好的方法来获得这种行为或将它们结合起来?

最佳答案

看起来像 onReceive可能是你需要的。代替:

.onChange(of: model.counter, perform: someLogic)
.onAppear { someLogic(counter: model.counter) }
你可以这样做:
.onReceive(model.$counter, perform: someLogic)
onChange 之间的区别和 onReceive是后者在 View 初始化时也会触发。

改变
如果你仔细看看 onChange ,您会看到它仅在值更改时才执行操作(并且在初始化 View 时不会发生这种情况)。
/// Adds a modifier for this view that fires an action when a specific
/// value changes.
/// ...
@inlinable public func onChange<V>(of value: V, perform action: @escaping (V) -> Void) -> some View where V : Equatable

接收
但是,计数器的发布者也会在 View 初始化时发出该值。这将使 onReceive执行作为参数传递的操作。
/// Adds an action to perform when this view detects data emitted by the
/// given publisher.
/// ...
@inlinable public func onReceive<P>(_ publisher: P, perform action: @escaping (P.Output) -> Void) -> some View where P : Publisher, P.Failure == Never

请注意 onReceive不是 相当于 onChange + onAppear . onAppear在 View 出现时调用,但在某些情况下, View 可能会在不触发 onAppear 的情况下再次初始化.

关于ios - 在 SwiftUI View 中结合 onChange 和 onAppear 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64392029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com