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

Posted

技术标签:

【中文标题】在 SwiftUI 中用另一个 @State 属性值初始化 @State 属性【英文标题】:Initialize @State property with another @State property value in SwiftUI 【发布时间】: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 传递值,但这些解决方案都不适合我????

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

你可能不需要这样做

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

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

【讨论】:

以上是关于在 SwiftUI 中用另一个 @State 属性值初始化 @State 属性的主要内容,如果未能解决你的问题,请参考以下文章

为 Swiftui 视图转换 @State 的计算属性

SwiftUI - @State 属性未更新

Init State var 来自另一个视图,swiftui [重复]

如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?

SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject

在 SwiftUI 中使用 @State 属性包装器未更新视图