在 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()
.
将其传递给子视图
如果您提供更多上下文,也可能有其他可能的解决方案。
我有一个 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()
.
如果您提供更多上下文,也可能有其他可能的解决方案。