UIViewRepresentable не будет обновлять мой ios набор данных диаграммы - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь преобразовать свои данные, полученные из API, в линейную диаграмму, но не могу заставить ее работать. Я храню данные в наблюдаемом объекте, поэтому их получение занимает несколько секунд, чтобы они не отображались на моем графике, но когда я жестко кодирую данные, они работают, я уверен, что получаю данные, но просто не получаю объявиться. спасибо

struct HomeView: View {
    @State var tabIndex:Int = 0

    @ObservedObject var homeViewModel = HomeViewModel()
    init() {
        homeViewModel.getTimelineBy("US")
    }

    var body: some View {

        VStack(alignment: .center) {

            TimelineChartView(timelineDataSet: self.$homeViewModel.countryTimeline)

        }.frame(height: 500.0)


    }
}

struct TimelineChartView: UIViewRepresentable {


    @Binding var timelineDataSet: [ChartDataEntry]

    func updateUIView(_ uiView: LineChartView, context: UIViewRepresentableContext<TimelineChartView>) {

    }

    var lineChart = LineChartView()

    func makeUIView(context: UIViewRepresentableContext<TimelineChartView>) -> LineChartView {
        setUpChart()
        return lineChart
    }

    func setUpChart() {
        lineChart.noDataText = "No Data Available"
        lineChart.rightAxis.enabled = false
        lineChart.backgroundColor = .white
        let dataSets = [getLineChartDataSet()]
        let yAxis = lineChart.leftAxis
        yAxis.labelFont = .boldSystemFont(ofSize: 13)
        yAxis.setLabelCount(5, force: false)
        yAxis.labelTextColor = .black
        yAxis.axisLineColor = .black
        yAxis.labelPosition = .outsideChart
        lineChart.xAxis.labelPosition = .bottom
        lineChart.xAxis.labelFont = .boldSystemFont(ofSize: 13)
        lineChart.xAxis.labelTextColor = .black
        lineChart.xAxis.axisLineColor = .systemBlue
        lineChart.animate(xAxisDuration: 2.5)
        lineChart.notifyDataSetChanged()
        let data = LineChartData(dataSets: dataSets)
        data.setValueFont(.systemFont(ofSize: 7, weight: .black))

        lineChart.data = data
    }

    func getChartDataPoints(selectedTimelineData: [ChartDataEntry]) -> [ChartDataEntry] {
        var dataPoints: [ChartDataEntry] = []
        for eachTimeline in selectedTimelineData {
            let entry = ChartDataEntry(x: eachTimeline.x, y: eachTimeline.y)
            dataPoints.append(entry)
        }
        return dataPoints

    }



    func getLineChartDataSet() -> LineChartDataSet {
        let test = getChartDataPoints(selectedTimelineData: timelineDataSet)

        let set = LineChartDataSet(entries: test, label: "DataSet")
        set.lineWidth = 4
        set.drawCirclesEnabled = false
        set.mode = .cubicBezier
        set.fillAlpha = 0.9
        set.drawFilledEnabled = true
        set.highlightColor = .systemRed
        return set
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        HomeView()
    }
}

1 Ответ

1 голос
/ 05 апреля 2020

Позвольте мне поделиться некоторыми из моих рабочих кодов. При изменении объекта привязки на диаграмме будут отображаться измененные данные.

struct HomeView: View {
  @State var barData: [String: Double] = [String: Double]()
  var body: some View {
     NavigationView {
       List {            
         CustomeView([BarChartVM(arg: self.$barData, title: "BarChart")])
       }
     }
   }
}

struct CustomeView<Page:View>: View {
  var viewControllers: [UIHostingController<Page>]
  init(_ views: [Page]) {
    self.viewControllers = views.map { UIHostingController(rootView: $0) }
  }
  var body: some View {
      CustomeViewController(controllers: viewControllers)
  }
}
struct CustomeViewController: UIViewControllerRepresentable {
  var controllers: [UIViewController]
  func makeUIViewController(context: Context) -> UIPageViewController {
    let pageViewController = UIPageViewController(
        transitionStyle: .scroll,
        navigationOrientation: .horizontal)
    return pageViewController
  }
  func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
    pageViewController.setViewControllers(
        [controllers[0]], direction: .forward, animated: true)
  }
}
struct BarChartVM: UIViewRepresentable {
  @Binding var arg: [String: Double]
  var title: String = ""
  let chart = BarChartView()

  func makeUIView(context: UIViewRepresentableContext<BarChartVM>) -> BarChartView {
    setUpChart()
    return chart
  }

  func updateUIView(_ uiView: BarChartView, context: UIViewRepresentableContext<BarChartVM>) {
    updateChartData()
  }

  func setUpChart() {
    chart.noDataText = "No data available"
    let pointArray = arg.sorted(by: <).map { $0.key }        
  }
  func updateChartData() {
    var entries = [BarChartDataEntry]()
    let valueArray = arg.sorted(by: <).map { $1 }
    for i in 0..<valueArray.count {
        let entry = BarChartDataEntry(x: Double(i), yValues: [valueArray[i]])
        entries.append( entry)
    }
    let set = BarChartDataSet(entries: entries, label: title)
    set.colors = ChartColorTemplates.material()      
    let data = BarChartData(dataSet: set)
    chart.data = data
  }
}
...