在 Swift 中使用静态函数通过 @State 或 @ObservableObject 动态更改颜色

Dynamically changing colors with @State or @ObservableObject using static functions in Swift

我有一个 SwiftUI 视图,顶部有几个文本字段,我正在尝试动态更改它们的颜色。到目前为止,我发现的最佳选择是保留一个 @State 变量,该变量包含与每个文本字段的颜色相对应的颜色数组。但是,我正在尝试从另一个 class 更新这个 @State,这似乎不可能。

为了解决这个问题,我考虑使用 ObservableObject@Published 数组,其工作方式与前面提到的颜色数组相同:class会改变颜色会在某个地方包含这个数组,并会用新颜色更新数组; View 将有一个 @ObservedObject,每个 Text 将引用 @ObservedObject.

不过这是我的问题:我希望能够更改颜色的函数是静态的。 Swift不会让我做一个@Published static var,所以这个静态函数不能改变作为@ObservedObject焦点的数组。有没有另一种方法可以设置类似于 @State@ObservedObject 的东西,让我可以动态更新颜色,也可以从静态函数访问?

以下是我希望设置的粗略概念:

保存文本元素的视图:

struct TextView: View {
    @ObservedObject var colorChange = ColorChangingClass()
    
    var body: some View {
        HStack {
            Text("Text Field 1")
                .padding()
                .background(Color.gray)
                .foregroundColor(colorChange.colorArray[0])
                .cornerRadius(5.0)
            Text("Text Field 2")
                .padding()
                .background(Color.gray)
                .foregroundColor(colorChange.colorArray[1])
                .cornerRadius(5.0)
            Text("Text Field 3")
                .padding()
                .background(Color.gray)
                .foregroundColor(colorChange.colorArray[2])
                .cornerRadius(5.0)
        }
    }
}

具有改变颜色的静态函数的class:

class ColorChangingClass: ObservableObject {
    static func changingColors() {
        // I want to be able to change the colors from here
    }
    
    // Swift won't let me make this static
    @Published var colorArray: [Color] = [Color.blue, Color.red, Color.green]
}

colorArray 的放置是灵活的,只要我可以从这个静态函数访问它,这似乎是我能找到的最接近解决方案的东西,但显然它不太管用。

Dynamically changing colors with @State or @ObservableObject using static functions in Swift

简单的回答:这是不可能的。

原因很简单:@Published 仅适用于实例 var 而不是 static


由于缺少上下文,我假设您想更改不同视图的颜色。如果那是将函数实现为静态的原因,则有一个 解决方法 .

在将它用作 @StateObject 的最顶部视图中实例化您的 ColorChangingClass。通过 .environmentObject().

将其传递给子视图

如果您提供更多上下文,也可能有其他可能的解决方案。