如何使用getData()在Swift中绘制带有ObjC PNChart库的LineChart?

我是一个新手程序员,最近开始学习Swift。

我正在Swift中创build一个项目,我的目的是在引入参数的同一个视图(使用由PNLineChart类控制的子视图)中绘制用户引入的信号函数。

事实上,我使用CocoaPods安装PNChart库,使用Objective C头文件的桥接头。 事情是,在ObjC中使用类和方法的方式是将它们“翻译”成Swift语法。 我发现PNChart有一个由作者制作的Swift实现,但是不能被Pods使用(如果有人知道如何将它们放到我的项目中,它也会有帮助)。

那么,作者在wiki中给出的数组图的ObjC代码如下所示:

#import "PNChart.h" //For Line Chart PNLineChart * lineChart = [[PNLineChart alloc] initWithFrame:CGRectMake(0, 135.0, SCREEN_WIDTH, 200.0)]; [lineChart setXLabels:@[@"SEP 1",@"SEP 2",@"SEP 3",@"SEP 4",@"SEP 5"]]; // Line Chart No.1 NSArray * data01Array = @[@60.1, @160.1, @126.4, @262.2, @186.2]; PNLineChartData *data01 = [PNLineChartData new]; data01.color = PNFreshGreen; data01.itemCount = lineChart.xLabels.count; data01.getData = ^(NSUInteger index) { CGFloat yValue = [data01Array[index] floatValue]; return [PNLineChartDataItem dataItemWithY:yValue]; }; // Line Chart No.2 NSArray * data02Array = @[@20.1, @180.1, @26.4, @202.2, @126.2]; PNLineChartData *data02 = [PNLineChartData new]; data02.color = PNTwitterColor; data02.itemCount = lineChart.xLabels.count; data02.getData = ^(NSUInteger index) { CGFloat yValue = [data02Array[index] floatValue]; return [PNLineChartDataItem dataItemWithY:yValue]; }; lineChart.chartData = @[data01, data02]; [lineChart strokeChart]; 

所以我试图把它转换成Swift,其中:

  • inputSignal:UITextField! – >将是用户引入math函数的textField(这仍在开发中)
  • 其他IBOutlet – >用于设置function限制和全局图表限制的参数
  • inputSignalLineChart:PNLineChart! – >将子视图连接到ViewController
  • initSignalExample – >初始数组来testing绘图
  • signalObtainedValues – > PNLineChartDatatypes的声明

在viewDidLoad()函数里面,我正在启动一个初始图表来testing它是否在View中工作。 当我尝试使用在PNLineChartData类中定义的getData()方法时,问题就出现了,我真的不能把它翻译成正确的Swift代码。

我的理解是,getData有一个UInteger称为索引(我认为它会select个人数据,但我没有看到它在任何地方声明: – /)作为输出,并作为输出返回一个PNLineChartDataItem()。 正如我在ObjC代码中看到的,做这件事的方式有点像PNLineChartDataItem(y:CGFloat),所以我想我可以做代码,如下所示:

 import UIKit class ViewController: UIViewController, PNChartDelegate{ @IBOutlet weak var inputSignal: UITextField! @IBOutlet weak var initialTimeInputSignal: UITextField! @IBOutlet weak var finalTimeInputSignal: UITextField! @IBOutlet weak var initialGlobalTime: UITextField! @IBOutlet weak var finalGlobalTime: UITextField! @IBOutlet weak var inputSignalLineChart: PNLineChart! let screenWidth = UIScreen.mainScreen().bounds.size.width let screenHeight = UIScreen.mainScreen().bounds.size.height let initSignalExample = [0.0, 1.0, 1.0, 1.0, 0.0] let signalObtainedValues: PNLineChartData! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. view.backgroundColor = UIColor.cyanColor() inputSignalLineChart.delegate = self inputSignalLineChart.frame = CGRectMake(0, 135.0, screenWidth, screenHeight) inputSignalLineChart.backgroundColor = UIColor.whiteColor() inputSignalLineChart.setXLabels(["0","1","2","3","4"], withWidth: 1) //signalObtainedValues.color = UIColor.greenColor() //signalObtainedValues.itemCount = UInt(inputSignalLineChart.xLabels.count) signalObtainedValues.getData(UInt(index)) = { PNLineChartDataItem(y: CGFloat(initSignalExample[index])) } //inputSignalLineChart.chartData = [signalObtainedValues] inputSignalLineChart.strokeChart() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

尝试和尝试我只得到错误:不能分配给这个expression式的结果,在getData()行。 所以我认为这是我在Swift中编写的代码的语法。 有没有人有任何想法如何做到这一点,并在子视图中正确绘制图表? 任何答案或有用的提示将不胜感激。 谢谢!

也许这可以写成如下closures:

 signalObtainedValues.getData() = { index in let yValue: CGFloat = initSignalExample[UInt(index)] return PNLineChartDataItem(y: yValue) } 

我终于find了解决问题的办法。 代码适用于我的是以下内容:

 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. view.backgroundColor = UIColor.cyanColor() playButton.layer.backgroundColor = UIColor.whiteColor().CGColor playButton.layer.cornerRadius = 5 let initSignalExample = [0.0, 1.0, 2.0, 1.0, 0.0] lineChartSubView.frame = CGRectMake(0, 0, screenWidth, screenHeight) lineChartSubView.backgroundColor = UIColor.whiteColor() lineChartSubView.setXLabels(["0","1","2","3","4"], withWidth: 1) lineChartSubView.showCoordinateAxis = true lineChartSubView.showLabel = true lineChartSubView.delegate = self var signalObtainedValues = PNLineChartData() signalObtainedValues.color = UIColor.greenColor() signalObtainedValues.itemCount = UInt(initSignalExample.count) signalObtainedValues.getData = ({(index: UInt) -> PNLineChartDataItem in var yValue:CGFloat = CGFloat(initSignalExample[Int(index)]) var item = PNLineChartDataItem(y: yValue) return item }) lineChartSubView.chartData = [signalObtainedValues] lineChartSubView.strokeChart() } 

现在问题是该图不适合子视图,但也许我会打开另一个问题,因为原来的post解决了。 非常感谢你!

这个怎么样?

 signalObtainedValues.getData = ({(index: Int) -> PNLineChartDataItem in var yValue:CGFloat = signalObtainedValues[index] var item = PNLineChartDataItem(y: yValue) return item}) 

我想问题是你忘了添加子视图,图表没有显示。

 lineChartSubView.chartData = [signalObtainedValues] lineChartSubView.strokeChart() self.view.addSubview(lineChartSubView)