Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UIViewRepresentable不会更新我的ios图表数据集_Ios_Swift_Swiftui_Ios Charts_Uiviewrepresentable - Fatal编程技术网

UIViewRepresentable不会更新我的ios图表数据集

UIViewRepresentable不会更新我的ios图表数据集,ios,swift,swiftui,ios-charts,uiviewrepresentable,Ios,Swift,Swiftui,Ios Charts,Uiviewrepresentable,我试图将从API派生的数据转换成折线图,但似乎无法使其正常工作。我将数据存储在一个可观察的对象中,因此需要几秒钟才能获取数据,因此它不会显示在我的图形上,但当我硬编码数据时,它工作了,我确信我获取了数据,但它根本不会显示。谢谢 struct HomeView: View { @State var tabIndex:Int = 0 @ObservedObject var homeViewModel = HomeViewModel() init() { ho

我试图将从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()
    }
}

让我分享一些我的代码。当绑定对象更改时,图表将显示更改的数据

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

这是一种黑客行为,每次在一个新页面上显示一个带有新图形的页面,根本不知道这有多低效。也就是说,这是我发现的唯一有效的解决方案!谢谢