我是一名新手程序员,最近开始学习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,其中:
在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中编写的代码的语法。有没有人知道如何做到这一点并在子视图中正确绘制图表?任何答案或有用的提示将不胜感激。谢谢!
答案 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)