将变量(颜色)传递给 NSView?

Passing A Variable (Color) To a NSView?

我希望有人能帮我弄清楚为什么我很难将变量传递给我的 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 从另一个视图控制器调用它,完全不需要单独的 myColor 变量。

您的 myColor 被输入为可选 (NSColor?)。因此,您必须先打开它才能获得它的 CGColor 属性。此外,您在此处处于匿名函数中,因此您必须明确引用 self 才能访问您的 属性。因此,这将解决问题:

innerRing.strokeColor = self.myColor!.CGColor

或者,更好的是,不要键入 myColor 作为可选;只需将其设为 NSColor。您可以这样做,因为您在声明中就给了它一个默认值。然后你将没有任何东西可以打开,也不需要感叹号。