在Combine的assign(to:on:)
主题中为@State赋值不会导致视图更新。在SwiftUI中,@State
属性包装器用于声明可变状态,并且当状态发生更改时,视图会自动更新以反映新的状态。然而,在Combine的assign(to:on:)
主题中为@State
赋值时,并不会触发视图的更新。
assign(to:on:)
是Combine框架中的一个操作符,用于将一个Publisher的输出值分配给一个可变的属性。它需要两个参数:一个可变属性和一个接收新值的闭包。当Publisher发出新值时,闭包将被调用,并将新值分配给可变属性。
由于assign(to:on:)
是在Combine框架中执行的,而不是在SwiftUI的视图更新循环中执行的,因此它不会触发视图的更新。这意味着,即使通过assign(to:on:)
为@State
属性赋予新值,视图也不会重新渲染。
要在Combine的assign(to:on:)
主题中更新视图,可以使用onReceive
修饰符。onReceive
修饰符用于订阅一个Publisher,并在接收到新值时执行操作。通过将onReceive
修饰符应用于@State
属性,可以在接收到新值时手动触发视图的更新。
以下是一个示例代码,演示了如何在Combine的assign(to:on:)
主题中更新视图:
import SwiftUI
import Combine
struct ContentView: View {
@State private var count = 0
private var cancellables = Set<AnyCancellable>()
var body: some View {
VStack {
Text("Count: \(count)")
.font(.largeTitle)
Button("Increment") {
count += 1
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
}
.onAppear {
Just(1)
.assign(to: &$count)
.store(in: &cancellables)
}
}
}
在上面的示例中,我们使用Just(1)
创建了一个Publisher,它发出一个值为1的元素。然后,我们使用assign(to: &$count)
将该值分配给@State
属性count
。最后,我们使用onAppear
修饰符订阅了这个Publisher,并在接收到新值时手动更新视图。
请注意,这只是一个示例,用于演示如何在Combine的assign(to:on:)
主题中更新视图。实际应用中,您可能会使用更复杂的Publisher和操作符来处理数据流。
领取专属 10元无门槛券
手把手带您无忧上云