如何使 CareKitUI 条形图与 SwiftUI 兼容
How to make CareKitUI Bar Charts compatible with SwiftUI
目前,使用 SwiftUI 对 CareKit 的支持有限。
我理解,一般来说,使对象符合 UIViewRepresentable
的想法,但我正在努力了解它在实践中的工作方式。
以下是来自 readme 的示例代码:
let chartView = OCKCartesianChartView(type: .bar)
chartView.headerView.titleLabel.text = "Doxylamine"
chartView.graphView.dataSeries = [
OCKDataSeries(values: [0, 1, 1, 2, 3, 3, 2], title: "Doxylamine")
]
因此 init(type)
、headerView.titleLabel
和 graphView.dataSeries
需要在符合 UIViewRepresentable
的结构中设置为 @Binding
变量,但我'我正在努力弄清楚如何使用以下两个函数:
func makeUIView() {}
func updateUIView() {}
如有任何帮助,我们将不胜感激。
实际上只有数据需要绑定,因为类型是初始化的一部分,标题几乎不可能改变,所以这里是可能的变体
struct CartesianChartView: UIViewRepresentable {
var title: String
var type: OCKCartesianGraphView.PlotType = .bar
@Binding var data: [OCKDataSeries]
func makeUIView(context: Context) -> OCKCartesianChartView {
let chartView = OCKCartesianChartView(type: type)
chartView.headerView.titleLabel.text = title
chartView.graphView.dataSeries = data
return chartView
}
func updateUIView(_ uiView: OCKCartesianChartView, context: Context) {
// will be called when bound data changed, so update internal
// graph here when external dataset changed
uiView.graphView.dataSeries = data
}
}
目前,使用 SwiftUI 对 CareKit 的支持有限。
我理解,一般来说,使对象符合 UIViewRepresentable
的想法,但我正在努力了解它在实践中的工作方式。
以下是来自 readme 的示例代码:
let chartView = OCKCartesianChartView(type: .bar)
chartView.headerView.titleLabel.text = "Doxylamine"
chartView.graphView.dataSeries = [
OCKDataSeries(values: [0, 1, 1, 2, 3, 3, 2], title: "Doxylamine")
]
因此 init(type)
、headerView.titleLabel
和 graphView.dataSeries
需要在符合 UIViewRepresentable
的结构中设置为 @Binding
变量,但我'我正在努力弄清楚如何使用以下两个函数:
func makeUIView() {}
func updateUIView() {}
如有任何帮助,我们将不胜感激。
实际上只有数据需要绑定,因为类型是初始化的一部分,标题几乎不可能改变,所以这里是可能的变体
struct CartesianChartView: UIViewRepresentable {
var title: String
var type: OCKCartesianGraphView.PlotType = .bar
@Binding var data: [OCKDataSeries]
func makeUIView(context: Context) -> OCKCartesianChartView {
let chartView = OCKCartesianChartView(type: type)
chartView.headerView.titleLabel.text = title
chartView.graphView.dataSeries = data
return chartView
}
func updateUIView(_ uiView: OCKCartesianChartView, context: Context) {
// will be called when bound data changed, so update internal
// graph here when external dataset changed
uiView.graphView.dataSeries = data
}
}