我正在尝试根据另一个值获取进度条的进度值。这两个变量(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传递值,但是这些解决方案都不适合我?
答案 0 :(得分:2)
您可能不需要这样做
@State var progress: Float = Float(waterQuantity)/Float(1500)
一个属性仅保留waterQuantity
并将其代码复制粘贴到视图主体中,并且在更改waterQuantity
时将刷新
答案 1 :(得分:2)
您应将进度更改为不存储任何值的已计算属性,而应根据waterQuantity的值动态计算其值:
var progress: Float {
Float(waterQuantity)/Float(1500)
}
现在,当更新waterQuantity时,您的视图仍将被重绘,因为在此计算属性内部使用了waterQuantity,而该属性又在您的视图中使用。