如何从另一个ViewController

时间:2018-04-02 04:35:38

标签: swift xcode charts segue viewcontroller

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

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

如何在应用程序打开时创建它。图表会自动更新,无需打开ViewController B.我尝试在ViewController A中调用函数从ViewController B生成图表,但是我得到一个错误,说明chart.info是零。

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

这是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")



    }

1 个答案:

答案 0 :(得分:0)

您无需创建视图控制器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
    }
}

现在在View Controller A中

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

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

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)!)