我一直在快速开发应用程序几个月,而且我无法弄清楚如何将数据传递到图表。基本上我所拥有的是一个内部有数组的视图控制器,以及一个包含图表的UIView。我想要做的是UIView中的图形在ViewController中绘制数组。所以我想要的是视图控制器中数组dataMoneyTracker1的数据传递给UIView中的数组graphPoints,或者我可以从uiview访问视图控制器中的数组。
感谢您的回答!
这是我的代码:
查看控制器
import UIKit
class GonDetail2ViewController: UIViewController {
var dataMoneyTracker1 = [Int]()
@IBOutlet var View1: UIView!
}
的UIView
import UIKit
class GonGraphUIView: UIView {
var graphPoints = [Int]()
override func drawRect(rect: CGRect) {
let width = rect.width
let height = rect.height
let margin:CGFloat = 20.0
let columnXPoint = { (column:Int) -> CGFloat in
//Calculate gap between points
let spacer = (width - margin*2 - 4) /
CGFloat((self.graphPoints.count - 1))
var x:CGFloat = CGFloat(column) * spacer
x += margin + 2
return x
}
let topBorder:CGFloat = 60
let bottomBorder:CGFloat = 50
let graphHeight = height - topBorder - bottomBorder
let maxValue = graphPoints.maxElement()
let columnYPoint = { (graphPoint:Int) -> CGFloat in
var y:CGFloat = CGFloat(graphPoint) /
CGFloat(maxValue!) * graphHeight
y = graphHeight + topBorder - y // Flip the graph
return y
}
UIColor.whiteColor().setFill()
UIColor.whiteColor().setStroke()
//set up the points line
let graphPath = UIBezierPath()
//go to start of line
graphPath.moveToPoint(CGPoint(x:columnXPoint(0),
y:columnYPoint(graphPoints[0])))
//add points for each item in the graphPoints array
//at the correct (x, y) for the point
for i in 1..<graphPoints.count {
let nextPoint = CGPoint(x:columnXPoint(i),
y:columnYPoint(graphPoints[i]))
graphPath.addLineToPoint(nextPoint)
}
graphPath.stroke()
graphPath.lineWidth = 2.0
graphPath.stroke()
//Draw the circles on top of graph stroke
for i in 0..<graphPoints.count {
var point = CGPoint(x:columnXPoint(i), y:columnYPoint(graphPoints[i]))
point.x -= 5.0/2
point.y -= 5.0/2
let circle = UIBezierPath(ovalInRect:
CGRect(origin: point,
size: CGSize(width: 5.0, height: 5.0)))
circle.fill()
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
}
}
答案 0 :(得分:1)
可以使用此变量重新定义UIViewController:
@IBOutlet var View1: GonGraphUIView!
并在GonGraphUIView
var graphPoints:[Int]?
然后在drawRect
if let graphPoints = graphPoints {
// draw the graph
} else { do nothing }
所以UIViewController可以说
View1.graphPoints = dataMoneyTracker1
View1.setneedsDisplay()
答案 1 :(得分:0)
有两种方法可以解决这个问题。
最简单的方法是在任何类之外定义var dataMoneyTracker1 = [Int]()
,然后您可以随时访问它。
或者您可以将其设为类变量,然后您可以访问它:
class GonDetailViewController: UIViewController{
static var dataMoneyTracker1 = [Int]()
}
class GonGraphUIView : UIView{
var graphPoints = GonDetailViewController.dataMoneyTracker1
}