我正在开发一个将过滤器应用于图像的应用程序。过滤器有许多用户可以修改的参数。我创建了一个包含所述参数的 ObservableObject。每当其中一个参数发生变化时,视图都会有可见的更新,即使视图显示的值与以前相同。当我将参数建模为单独的 @State 变量时,不会发生这种情况。
如果这是意料之中的(毕竟观察到的对象确实发生了变化,因此依赖于它的每个视图都会更新),那么 ObservedObject 是否适合这项工作?另一方面,将参数建模为单独的@State/@Binding 变量似乎非常不方便,特别是如果需要将大量参数(例如10+)传递给多个子视图!
因此我的问题是:
我在这里正确使用 ObservedObject 吗?可见更新是无意的,但可以接受,还是在 swiftUI 中有更好的解决方案来处理这个问题?
使用@ObservedObject 的示例:
import SwiftUI
class Parameters: ObservableObject {
@Published var pill: String = "red"
@Published var hand: String = "left"
}
struct ContentView: View {
@ObservedObject var parameters = Parameters()
var body: some View {
VStack {
// Using the other Picker causes a visual effect here...
Picker(selection: self.$parameters.pill, label: Text("Which pill?")) {
Text("red").tag("red")
Text("blue").tag("blue")
}.pickerStyle(SegmentedPickerStyle())
// Using the other Picker causes a visual effect here...
Picker(selection: self.$parameters.hand, label: Text("Which hand?")) {
Text("left").tag("left")
Text("right").tag("right")
}.pickerStyle(SegmentedPickerStyle())
}
}
}
使用@State 变量的示例:
import SwiftUI
struct ContentView: View {
@State var pill: String = "red"
@State var hand: String = "left"
var body: some View {
VStack {
Picker(selection: self.$pill, label: Text("Which pill?")) {
Text("red").tag("red")
Text("blue").tag("blue")
}.pickerStyle(SegmentedPickerStyle())
Picker(selection: self.$hand, label: Text("Which hand?")) {
Text("left").tag("left")
Text("right").tag("right")
}.pickerStyle(SegmentedPickerStyle())
}
}
}