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

时间:2015-03-13 13:43:21

标签: ios objective-c swift linechart

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

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

事实是我使用CocoaPods安装了PNChart库,使用了Objective C头的桥接头。问题是在ObjC中使用clases和方法的方法是"翻译"他们以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! - >将是用户介绍数学函数的textField(这仍在开发中)
  • 其他IBOutlet - >用于设置功能限制和全局图表限制的参数
  • inputSignalLineChart:PNLineChart! - >将subView连接到ViewController
  • initSignalExample - >用于测试绘图的初始数组
  • signalObtainedValues - >声明PNLineChartData类型

在viewDidLoad()函数中,我正在启动一个初始图表,以测试它是否在View中有效。当我尝试使用PNLineChartData类中定义的方法getData()并且我无法将其转换为正确的Swift代码时,问题出现了。

我的理解是getData输入一个名为index的UInteger(我认为它将选择单个数据,但我没有看到它在任何地方声明: - /)并且作为输出它返回一个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.
    }


}

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

4 个答案:

答案 0 :(得分:1)

也许这可以写成闭包,如下所示:

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

答案 1 :(得分:1)

我终于找到了问题的解决方案。适用于我的代码如下:

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

}

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

答案 2 :(得分:0)

这个怎么样?

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

答案 3 :(得分:0)

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

lineChartSubView.chartData = [signalObtainedValues]
lineChartSubView.strokeChart()

self.view.addSubview(lineChartSubView)