我希望有人可以帮我弄清楚为什么我很难将变量传递给我的NSView。基本上,我试图设置一个变量(myColor
)来设置我正在绘制的圆的颜色。代码看起来像这样;
import Cocoa
class Circle: NSView {
var myColor:NSColor? = NSColor.greenColor()
lazy var innerRing: CAShapeLayer = {
let innerRing = CAShapeLayer()
let circleRadius: CGFloat = 20.0
innerRing.frame = self.bounds
var circleFrame = CGRect(x: 0, y: 0, width: circleRadius, height: circleRadius)
circleFrame.origin.x = CGRectGetMidX(self.bounds) - CGRectGetMidX(circleFrame)
circleFrame.origin.y = CGRectGetMidY(self.bounds) - CGRectGetMidY(circleFrame)
innerRing.path = CGPathCreateWithEllipseInRect(circleFrame, nil)
innerRing.lineWidth = 3.0
innerRing.strokeStart = 0.0
innerRing.strokeEnd = 0.75
innerRing.fillColor = NSColor.clearColor().CGColor
innerRing.strokeColor = myColor.CGColor
//THIS LINE THROWS THE ERROR
return innerRing
}()
override func awakeFromNib() {
super.awakeFromNib()
wantsLayer = true
layer = CALayer()
layer?.addSublayer(innerRing)
}
}
我一直收到错误实例成员'myColor'不能用于'Circle'类型。如果我将strokeColor
设置为简单的东西,比如NSColor.blueColor()。CGColor,它编译没有问题。但我以前从来没有设置变量这样的问题,我不确定我做错了什么。
编辑:使用解决方案进行更新
import Cocoa
class Circle: NSView {
lazy var innerRing: CAShapeLayer = {
let innerRing = CAShapeLayer()
let circleRadius: CGFloat = 20.0
innerRing.frame = self.bounds
var circleFrame = CGRect(x: 0, y: 0, width: circleRadius, height: circleRadius)
circleFrame.origin.x = CGRectGetMidX(self.bounds) - CGRectGetMidX(circleFrame)
circleFrame.origin.y = CGRectGetMidY(self.bounds) - CGRectGetMidY(circleFrame)
innerRing.path = CGPathCreateWithEllipseInRect(circleFrame, nil)
innerRing.lineWidth = 2.0
innerRing.strokeStart = 0.0
innerRing.strokeEnd = 0.75
innerRing.fillColor = NSColor.greenColor().CGColor
innerRing.strokeColor = NSColor.blackColor().CGColor
return innerRing
}()
override func awakeFromNib() {
super.awakeFromNib()
wantsLayer = true
layer = CALayer()
layer?.addSublayer(innerRing)
}
}
然后我使用cirleView.innerRing.strokeColor = NSColor.redColor().CGColor
从另一个View Controller调用此内容,完全不需要单独的myColor
变量。
答案 0 :(得分:1)
您的myColor
被输入为可选(NSColor?
)。因此,您必须先解开它,然后才能获得CGColor
属性。此外,您在此处使用匿名函数,因此您必须明确提及self
才能访问您的媒体资源。因此,这将解决问题:
innerRing.strokeColor = self.myColor!.CGColor
或者,更好的是,不键入myColor
作为可选项;只是让它成为NSColor。你可以这样做,因为你在声明中给它一个默认值。然后,你将无需打开任何东西,也不需要感叹号。