如何从另一个 ViewController 更新 LineChart

Posted

技术标签:

【中文标题】如何从另一个 ViewController 更新 LineChart【英文标题】:how to update LineChart from another ViewController 【发布时间】:2018-04-02 04:35:38 【问题描述】:

我有 2 个视图控制器。 ViewController A 获取信息,ViewController B 使用 Charts 框架在折线图中设置信息。

我这样做是为了在一天结束时更新折线图。这可以正常工作,但是,用户必须打开 ViewController B 才能使用前一天收到的新信息更新折线图。

我怎样才能做到这一点,以便每当应用程序打开时。该图表会自动更新,无需打开 ViewController B。我尝试调用该函数以在 ViewController A 中从 ViewController B 制作图表,但我收到一条错误消息,提示 chart.info 为 nil。

我试图寻找一种方法来做到这一点。但我找不到任何东西。

这里是 ViewController B。它是由 ViewController A 中的一个 segue 打开的:

func makeChart()
    let today = Calendar.current.component(.day, from: Date())
    let compare = UserDefaults.standard.integer(forKey: "userDate")

    print(today)


    print(ViewController.totalReps)
    // var points = UserDefaults.standard.array(forKey: "array") as! [Int]
    var points: [Int] = []


  //Checks if the day passed
    if today != compare
        UserDefaults.standard.set(today, forKey: "userDate")

    points = UserDefaults.standard.array(forKey: "array") as? [Int] ?? [Int]()

        let userReps = UserDefaults.standard.integer(forKey: "userReps")
        points.append(userReps)
        UserDefaults.standard.set(points, forKey: "array")



    //UserDefaults.standard.set(points, forKey: "array")
    var chartEntry = [ChartDataEntry]()

    print(points)
    for i in 0..<points.count 

        let value = ChartDataEntry(x: Double(i), y: Double(points[i]))
        chartEntry.append(value)
    

    let line = LineChartDataSet(values: chartEntry, label: "Reps")

    line.colors = [NSUIColor.blue]
    let info = LineChartData()


    info.addDataSet(line)

    Chart.data = info

    Chart.chartDescription?.text = "Reps"

    //reset values
    ViewController.totalReps = 0
    UserDefaults.standard.set(0, forKey: "userReps")



    

【问题讨论】:

如果您想在 viewController B 中显示图表,那么您可以每次在 viewWillApper 中更新。 只需要将数据保存到 userDefaults。 您好,viewWillAppear 是在 Viewcontroller A 还是 B 中? 你好 @AlexMerlin 每次都保存你在 UserDefaults 中的更改,并且当你在 ViewController B 中打开应用程序时,会自动从用户默认设置图形的值,这样它就会自动反映而无需转到 ViewController B . 或第二种解决方案,如果您的图表数据是静态的,即如果添加后您不需要定期删除它,那么您可以使用 Core Data。 不是我说的,将图表的数据存储在一个数组中,然后将该数组存储到 UserDefault 中。使用此 USerDefault 在图表中显示数据,因此,如果在 VC A 中更新数据,它将自动反映到 ViewController B。如果您愿意,我可以编写代码让您将 Array 保存到 UserDefault 然后利用它 【参考方案1】:

创建图表不需要创建视图控制器B 我假设您正在全局保存值,并且可以在 ViewController B 中访问

只需创建一个 Empty Swift 文件并按照描述创建一个类

class newLineChart: NSObject


    /// A Shared Instance
    /// This will Initiate class
    /// Using this we will directly use this class Created Components
    static var shared = LineChart()


    /// This is Main function through which chart is being created
    /// Just return chart created at the endf of function
    /// I used Swift Charts and i just used global Values of charts
    /// Accessed in Required func where chart is getting created
    /// At the end return chart
    /// Add the returned chart in my subviews
    func makeChanges() -> Chart
    
        /// Your code goes Here
        /// Chart Instance
        /// Upadte Axis and all Labels as per requirement
        return Chart
    

现在在视图控制器 A 中

/// Add Returned chart Subview
self.myCustomContainerView.addSubview(newLineChart.shared.makeChanges.view)

我使用过 SwiftCharts 框架 我的班级看起来像这样

class DoubleSidedChart: NSObject

    /// Shared Instance
    static var shared = DoubleSidedChart()

    override init()   

    deinit 
        //Used
    



//MARK:- Get into CSV File
extension DoubleSidedChart


    func createCharts(leftView:UIView,rightView:UIView) -> (Chart,Chart)
    
        return (leftChart(realChartPoints: chartPointsForLeftChart, secondModel: secondLineCPLeft, leftChartView: leftView),rightChart(realChartPoints: chartPointsForRightChart, secondModel: secondLineCPRight, rightChartView: rightView))
    


//MARK:- Get charts - DoubleSidedChart
extension DoubleSidedChart

    func leftChart(realChartPoints: [(Double,Double)],secondModel : [(Double,Double)], leftChartView: UIView) -> Chart
    
        self.leftAxischart?.clearView()
        leftAxischart = nil

        /// My code for Left axis Chart

        //SubLayers
        self.leftAxischart = Chart(
            frame: chartFrame,
            innerFrame: innerFrame,
            settings: chartSettings,
            layers: [
                xAxisLayer,
                yAxisLayer,
                guidelinesLayer,
                chartPointsLineLayer,
                chartPointsLineLayer1
            ]
        )
        return leftAxischart!
    
    func rightChart(realChartPoints: [(Double,Double)],secondModel : [(Double,Double)], rightChartView: UIView) -> Chart
    
        self.rightAxisChart?.clearView()
        rightAxisChart = nil
        /// My code

        rightAxisChart = Chart(
            frame: chartFrame,
            innerFrame: innerFrame,
            settings: chartSettings,
            layers: [
                xAxisLayer,
                yAxisLayer,
                guidelinesLayer,
                chartPointsLineLayer,
                chartPointsLineLayer1
            ]
        )

        rightAxisChart?.view.backgroundColor = UIColor.clear
        return rightAxisChart!
    

我的班级使用情况

 var DSC : DoubleSidedChart?
 DSC = DoubleSidedChart()  

/// Add Subview
let DSCV = DSC?.createCharts(leftView: leftChartView, rightView: rightChartView)
leftChartView.addSubview((DSCV?.0.view)!)
rightChartView.addSubview((DSCV?.1.view)!)

【讨论】:

以上是关于如何从另一个 ViewController 更新 LineChart的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何从另一个类 X 更新 UILabel:UIButton

如何从另一个 viewController 访问 tabBar 单击

如何从另一个 ViewController 中选择 UITableViewController 行?

如何从 Xamarin MacOS 开发中的另一个 C# 文件更新 ViewController.cs 中的“标签”?

在 Swift 中从另一个 ViewController 访问变量

从另一个 .swift 文件调用 ViewController 函数