在 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 属性的主要内容,如果未能解决你的问题,请参考以下文章
Init State var 来自另一个视图,swiftui [重复]
如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?
SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject