子视图中的@State和@Published属性,SwiftUI

时间:2020-10-17 18:41:19

标签: ios swift swiftui state

MyController 中,我具有以下属性,该属性在称为的其他方法中进行了更新:

@Published public var data = [Glucose]()

我还有一个函数,该函数通过给定的Published来限制此limit属性:

public func latestReadings(limit: Int = 5) -> [Glucose] {
        // return latests results
}

在SwiftUI视图中,我通过以下方式消耗此数据,该数据可以正常工作并在MyController的{​​{1}}更改时更新:

data

但是,我想在这里调用以下内容,它将 @EnvironmentObject var data: MyController var body: Some View { ForEach(self.data.latestReadings(limit: 11), id: \.self) { /// Display Text etc. } } 的读数转换为Glucose消耗的DataPoint数组:

Chart

...哪个引用了另一个SwiftUI视图,定义为:

Chart(
    data: self.data.latestReadings(limit: 37),
    formattedBy: { (readings) -> [DataPoint] in
        var result = [DataPoint]()
        var i = 0
        for reading in readings {
            result.append(DataPoint(x: Double(i), y: reading.mmol))
                i += 1
            }
            return result
        }
    )

这一切都在第一次绘制struct Chart: View { // Properties @State var data: [DataPoint] // I asusme this should be @State var opt: ChartOptions // Formatters private var fmt: Formatting = Formatting.shared // Init public init(data: [Glucose], formattedBy:ChartDataFormatter) { _data = State(wrappedValue: formattedBy(data)) // Again I assume this is probably wrong.. } ...draw views etc. } 时起作用,但是Chart视图上的data属性不会重新绘制为Chart {{ 1}}属性更改。我以为我做错了状态,并在这里观察到了变化?

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的工作流程,则不需要在Chart中使用状态包装,因为它可以防止值更新...因此请尝试不使用状态包装,例如

struct Chart: View {
    // Properties
    var data: [DataPoint]

    // ... 
    
    // Init
    public init(data: [Glucose], formattedBy:ChartDataFormatter) {
        self.data = formattedBy(data)
    }

    // ...

答案 1 :(得分:1)

pipeline { agent {label '!master'} } stages { stage('Run ih api tests') { steps { sh 'mvn clean verify -P merge' } } } } 断开与控制器的连接。 Per the documentation @State应该始终为@State

使用private传递data,并在视图内或@EnvironmentObject中对其进行操作。