如何从另一个 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 中的“标签”?