【问题标题】:@State and @Published properties in child views, SwiftUI子视图中的 @State 和 @Published 属性,SwiftUI
【发布时间】:2021-01-31 23:21:44
【问题描述】:

MyController 中,我有以下属性,该属性在其他被调用的方法中更新:

@Published public var data = [Glucose]()

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

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

在 SwiftUI 视图中,我通过以下方式使用这些数据,当MyControllerdata 发生变化时,这些数据可以正常工作并更新:

    @EnvironmentObject var data: MyController

    var body: Some View {
        ForEach(self.data.latestReadings(limit: 11), id: \.self) {
            /// Display Text etc.
        }
    }

但是,我想在这里调用以下代码,它将Glucose 读数转换为Chart 使用的DataPoint 数组:

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
        }
    )

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

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,但Chart 视图上的data 属性不会随着MyController data 属性的变化而重新绘制。我假设我在状态方面做错了什么并在这里观察变化?

【问题讨论】:

    标签: ios swift swiftui state


    【解决方案1】:

    @State 断开与控制器的连接。 Per the documentation @State 应始终为 private

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

    【讨论】:

    • 谢谢。现在更多地调查状态!干杯。
    【解决方案2】:

    如果我正确理解了您的工作流程,您不需要 Chart 中的状态包装器,因为它会阻止值更新...所以请尝试不使用它,例如

    struct Chart: View {
        // Properties
        var data: [DataPoint]
    
        // ... 
        
        // Init
        public init(data: [Glucose], formattedBy:ChartDataFormatter) {
            self.data = formattedBy(data)
        }
    
        // ...
    

    【讨论】:

    • 这行得通。谢谢!你知道,这是我第一次尝试的,但我可能只是没有等待足够长的时间!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2020-10-21
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多