【问题标题】:Initialize @State property with another @State property value in SwiftUI在 SwiftUI 中用另一个 @State 属性值初始化 @State 属性
【发布时间】:2020-07-12 13:18:50
【问题描述】:

我正在尝试根据另一个值获取进度条的进度值。这两个变量(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)
        }
    }
}

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

【问题讨论】:

    标签: swift swiftui property-wrapper


    【解决方案1】:

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

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

    现在当 waterQuantity 被更新时,你的视图仍然会被重绘,因为 waterQuantity 是在这个计算属性中使用的,而这个属性又会在你的视图中使用。

    【讨论】:

    • 谢谢!这对我来说是最好的解决方案,除非你不能包装计算属性(但这是另一个小问题)。 ?
    • 为什么要包装计算属性?
    【解决方案2】:

    你可能不需要这样做

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

    一个属性只留下waterQuantity 并将该代码复制粘贴到视图主体中,当waterQuantity更改时它将被刷新

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2021-10-19
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多