在SwiftUI中使用另一个@State属性值初始化@State属性

时间:2020-07-12 13:18:50

标签: swift swiftui property-wrapper

我正在尝试根据另一个值获取进度条的进度值。这两个变量(waterQuantity和progress)都在属性包装器中 @State

这是我的代码:

struct CircularProgressBar: View {
@State var waterQuantity: Int
@State var progress: Float = (1 + (Float(waterQuantity)/Float(1500))) * 100

var body: some View {
    ZStack {
        Circle()
            .foregroundColor(.white)
            .padding(25)
            .overlay(
                Circle()
                    .trim(from: 0.0, to: CGFloat(min(self.progress, 1.0)))
                    .stroke(style: StrokeStyle(lineWidth: 25
                        , lineCap: .round, lineJoin: .round))
                    .foregroundColor(Color.blue)
                    .rotationEffect(Angle(degrees: 270.0))
                    .animation(.linear)
                    .padding(50)
        )
        
        VStack {
            Text(String(format: "%.0i mL", 500))
                .font(.largeTitle)
                .bold()
                .foregroundColor(Color("bgStart"))
            Text("1500 mL")
                .foregroundColor(.gray)
        }
    }
}

如您所见,我无法使用尚未初始化的另一个变量初始化进度。我尝试使用init()和muting func传递值,但是这些解决方案都不适合我?

2 个答案:

答案 0 :(得分:2)

您可能不需要这样做

@State var progress: Float = Float(waterQuantity)/Float(1500)

一个属性仅保留waterQuantity 并将其代码复制粘贴到视图主体中,并且在更改waterQuantity时将刷新

答案 1 :(得分:2)

您应将进度更改为不存储任何值的已计算属性,而应根据waterQuantity的值动态计算其值:

var progress: Float {
    Float(waterQuantity)/Float(1500)
}

现在,当更新waterQuantity时,您的视图仍将被重绘,因为在此计算属性内部使用了waterQuantity,而该属性又在您的视图中使用。