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

标签 macos swift 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”上使用。如果我将 planeColor 设置为简单的内容,例如 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.tripColor = NSColor.redColor().CGColor从另一个 View Controller 调用它,从而无需单独的myColor变量总共。

最佳答案

您的 myColor 被键入为可选 (NSColor?)。因此,您必须先解开它,然后才能获取其 CGColor 属性。另外,您在这里处于匿名函数中,因此您必须显式引用 self 才能访问您的属性。因此,这将解决问题:

innerRing.strokeColor = self.myColor!.CGColor

或者,更好的是,不要输入 myColor 作为可选项;只需将其设置为 NSColor 即可。您可以这样做,因为您在声明中为其指定了默认值。这样您就没有任何东西可以打开,也不需要感叹号。

关于macos - 将变量(颜色)传递给 NSView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826903/

相关文章:

Cocoa - 以编程方式垂直拉伸(stretch) NSView,向下移动其后的所有内容

macos - 如何通过在 Mac OS X 中给出进程名称来获取进程的 PID?

iphone - 是/真之间的区别?

Swift 范围类型 endIndex

cocoa - 在 cocoa 应用程序中检测 Enter/Return 键的最佳方法?

objective-c - 如何从不完全可见的 NSView 创建 NSImage?

macos - OSX 已弃用蓝牙功能

ios - 如果 block 内发生异常会怎样?

swift - 不能用存储的属性覆盖

swift - 如何在快捷方式中使多个标签可单击?