【问题标题】:Passing A Variable (Color) To a NSView?将变量(颜色)传递给 NSView?
【发布时间】:2015-09-28 15:44:41
【问题描述】:

我希望有人能帮助我弄清楚为什么我很难将变量传递给我的 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)
}
}

我不断收到错误Instance member 'myColor' cannot be used on type '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 变量。

【问题讨论】:

    标签: macos swift nsview


    【解决方案1】:

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

    innerRing.strokeColor = self.myColor!.CGColor
    

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

    【讨论】:

    • 嗨@matt - 我确实尝试过设置innerRing.strokeColor = myColor!.CGColor(或者完全不让它成为可选的;这给了我var myColor: NSColor = NSColor.greenColor()这一行,但我仍然继续收到Instance member'编译时,myColor' 不能用于类型“Circle”
    • 嗨@matt!您的建议有助于消除编译器中的错误!谢谢你。我遇到的问题是……这实际上不起作用。更具体地说,我在自定义表格单元格中有一个 NSView 设置为我的 Circle 子类。在我的 NSTableViewController 中,我使用的是cellView.circleIndicator.myColor = NSColor.redColor()。它可以编译并运行,但颜色始终默认为我在 Circle.swift 文件中设置的任何颜色。它似乎不尊重我设置的颜色,就像它没有被通过一样。有什么想法吗?
    • 嗨@matt!漠视。我仍然无法从我的视图控制器设置变量,但我已经编辑了我的答案,说明我是如何让它工作的,感谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2013-03-15
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多