Инициализировать свойство @State с другим значением свойства @State в SwiftUI - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь получить значение индикатора выполнения на основе другого значения. Обе эти переменные (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 () и изменять fun c, но ни одно из этих решений не помогло мне ?

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вы должны изменить прогресс на вычисляемое свойство, которое не хранит никакого значения, а скорее вычисляет его значение динамически на основе значения waterQuantity:

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

Теперь, когда waterQuantity обновляется, ваше представление будет по-прежнему перерисован, потому что waterQuantity используется внутри этого вычисляемого свойства, которое, в свою очередь, используется в вашем представлении.

2 голосов
/ 12 июля 2020

Возможно, вам не нужно делать это

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

свойством, просто оставьте только waterQuantity и скопируйте и вставьте этот код в тело представления, и он будет обновлен при изменении waterQuantity

...