代码之家  ›  专栏  ›  技术社区  ›  Ilja

是否可以创建一个只返回ChartContent的View组件?

  •  0
  • Ilja  · 技术社区  · 9 月前

    我有一个复杂的图表,可以以不同的风格呈现各种图形,并且正在将这些变体抽象为单独的视图组件,其中一个例子是

    import SwiftUI
    import Charts
    
    
    struct ExerciseChartPlot: View {
      
      // Public Variables
      let isLineChart: Bool
      let xLabel: String
      let yLabel: String
      let calendarUnit: Calendar.Component
      let date: Date
      let value: Double
      
      // Body
      var body: some View {
        if isLineChart {
          LineMark(x: .value(xLabel, date, unit: calendarUnit), y: .value(yLabel, value))
            .foregroundStyle(Color._green)
            .symbol(.circle)
          AreaMark(x: .value(xLabel, date, unit: calendarUnit), y: .value(yLabel, value))
            .foregroundStyle(LinearGradient(colors: [._green.opacity(0.2), .clear], startPoint: .top, endPoint: .bottom))
        } else {
          BarMark(x: .value(xLabel, date, unit: calendarUnit), y: .value(yLabel, value))
            .foregroundStyle(Color._green.gradient)
        }
      }
    }
    

    但它导致了“静态方法'buildExpression'要求'some ChartContent'符合'View'”的错误

    我想这是因为我在没有包装的情况下退回了组件 Chart .我想保留 图表 ui树中“更高层”的组件,只有这些较小的组件返回需要在其中呈现的图表元素。

    有可能以某种方式实现这一点吗?

    1 回复  |  直到 9 月前
        1
  •  1
  •   Sweeper    9 月前

    你试图创造的不是 View ,但是a ChartContent .使你的结构符合 图表内容 相反:

    struct ExerciseChartPlot: ChartContent {
      
      // Public Variables
      ...
      
      // Body
      var body: some ChartContent {
          ...
      }
    }
    

    然后,您可以像使用其他任何东西一样使用它 图表内容 在里面 Chart { ... } .

    struct SomeView: View {
        var body: some View {
            Chart {
                ExerciseChartPlot(...)
            }
        }
    }