SwiftUI-使用环境对象的@Published属性更新嵌入式视图

时间:2020-07-15 17:41:17

标签: swift animation button swiftui toggle

所以,这有点复杂,但是我设置了一个Environment Object类并将其与ObservableObject兼容...该类有点像我的应用程序的大脑/数据管理器...我创建了几个不同的@Published属性并将它们分配给bool值,每个按钮对应一个。

然后,我创建了一个具有2个bool属性的自定义按钮结构,并将这两个属性都标记为@State,但是没有任何值,并在我的按钮中使用它们来控制几个图像的颜色(即Image frontColor和背景)...

最后,我使用我的Environment Object类的@Published属性作为每个按钮结构的输入,将一堆这些按钮嵌入到主视图结构中。

这是问题所在...当环境对象更新这些布尔值时,我的视图结构没有更改其值/动画。我设置了一些打印文件以确保环境对象中的值发生更改,并在视图结构中测试了本地更改值,但是视图不会从环境对象中更新...

我尽可能多地粘贴代码,以使应用变得越来越沉重,但希望有另外一种属性或方法可以使属性随着值的变化而不断监视和更新。

通过按钮struct:

struct OPButton: View {

let buttonImage: String
let buttonImageSize: CGFloat = 20
let buttonSizeWidth: CGFloat = 20
let buttonSizeHeight: CGFloat = 20
@State var invertColorToggle: Bool
@State var buttonFlash: Bool
@EnvironmentObject var env: GlobalEnvironment

var body: some View {

        let tapGesture = TapGesture().onEnded({
            self.env.receiveInput(calcButton: self.buttonImage)

        })


    return Image(systemName: buttonImage)
        .font(.system(size: buttonImageSize))
        .frame(width: buttonSizeWidth, height: buttonSizeHeight)
        .foregroundColor(invertColorToggle ? Color.orange : Color.white)
        .animation(.easeInOut)
        .background(buttonFlash ? Color.white : Color.orange)
        .animation(.easeOut)
        .cornerRadius(buttonSizeHeight)
        .gesture(bothGestures)
}

从主视图结构中:

@EnvironmentObject var env: GlobalEnvironment

HStack (spacing: buttonLook.buttonSpacing){

OPButton(buttonImage: "heart", invertColorToggle: env.invertColorHEART, buttonFlash: env.invertIconHEART)

来自环境对象:

class GlobalEnvironment: ObservableObject {

@Published var invertColorHEART = false
@Published var invertIconHEART = false 

提前感谢您的帮助和时间:)

0 个答案:

没有答案