Cocoa 更改CALayer属性:EXC\u BAD\u指令

Cocoa 更改CALayer属性:EXC\u BAD\u指令,cocoa,core-animation,Cocoa,Core Animation,我试图通过点击一个子层来实现对它的选择,并通过改变子层的背景色来可视化它已经被选中。但是,无论我如何尝试更改任何属性,最终都会出现以下错误: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) Her是从NSViewsub类“mouseupffunction”调用的我的函数 我还尝试了hitLayer.setValue NSColor.red.cgColor,forKeyPath:backgroundColor,并尝

我试图通过点击一个子层来实现对它的选择,并通过改变子层的背景色来可视化它已经被选中。但是,无论我如何尝试更改任何属性,最终都会出现以下错误:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
Her是从NSViewsub类“mouseupffunction”调用的我的函数

我还尝试了hitLayer.setValue NSColor.red.cgColor,forKeyPath:backgroundColor,并尝试用CATransaction.begin和CATransaction.commit将其包围起来,或者更改子层的任何其他属性。但是没有成功


知道我的代码出了什么问题吗?

错误消息告诉您一种解决方案:在CPCoursePointLayer中实现initlayer:

在层上设置特性时,如果该层位于非隐藏窗口的层树中,则核心动画将通过发送到该层来查找该特性的动作。如果该搜索返回nil,则核心动画将使用一些默认参数为特性创建隐式动画

任何带有附加动画的层都有相应的表示层。阅读更多信息。因此,核心动画需要为hitLayer创建相应的表示层。它使用CPCoursePointLayer类上的initlayer:initializer来实现这一点

在Swift中,类不会自动继承其超类的所有构造函数,因此您的CPCoursePointLayer类没有该初始值设定项。所以你的应用程序崩溃了

一种解决方案是将initlayer:初始值设定项添加到CPCoursePointLayer类:

如果定义initlayer:,则可以设置图层特性的动画,并允许隐式设置这些特性的动画

如果您从未计划显式或隐式设置层属性的动画,则可以在Core Animation搜索动作时通过返回NSNull禁用隐式动画,例如将此方法添加到CPCoursePointLayer类:


错误消息告诉您一种解决方案:在CPCoursePointLayer中实现initlayer:

在层上设置特性时,如果该层位于非隐藏窗口的层树中,则核心动画将通过发送到该层来查找该特性的动作。如果该搜索返回nil,则核心动画将使用一些默认参数为特性创建隐式动画

任何带有附加动画的层都有相应的表示层。阅读更多信息。因此,核心动画需要为hitLayer创建相应的表示层。它使用CPCoursePointLayer类上的initlayer:initializer来实现这一点

在Swift中,类不会自动继承其超类的所有构造函数,因此您的CPCoursePointLayer类没有该初始值设定项。所以你的应用程序崩溃了

一种解决方案是将initlayer:初始值设定项添加到CPCoursePointLayer类:

如果定义initlayer:,则可以设置图层特性的动画,并允许隐式设置这些特性的动画

如果您从未计划显式或隐式设置层属性的动画,则可以在Core Animation搜索动作时通过返回NSNull禁用隐式动画,例如将此方法添加到CPCoursePointLayer类:


异常的完整堆栈跟踪是什么?调试器中po hitLayer的输出是什么?CPCoursePointLayer.swift:11:7:致命错误:对于类“CoursePlanner.CPCoursePointLayer”,使用未实现的初始值设定项“initlayer:”,对我来说没有意义。。。CPCoursePointLayer是CAShapeLayer的一个子类,它是这个类的一个实例,我从hitTestwarning返回:无法执行支持代码来读取过程中的Objective-C类数据。这可能会降低可用类型信息的质量。异常的完整堆栈跟踪是什么?调试器中po hitLayer的输出是什么?CPCoursePointLayer.swift:11:7:致命错误:对于类“CoursePlanner.CPCoursePointLayer”,使用未实现的初始值设定项“initlayer:”,对我来说没有意义。。。CPCoursePointLayer是CAShapeLayer的一个子类,它是这个类的一个实例,我从hitTestwarning返回:无法执行支持代码来读取过程中的Objective-C类数据。这可能会降低可用类型信息的质量。实现initlayer:没有帮助。但是,覆盖defaultAction确实做到了。我不需要在任何情况下,这是动画,所以它对我来说足够了。谢谢你的详细解释,罗伯!实现initlayer:没有帮助。但是,覆盖defaultAction确实做到了。我不需要在任何情况下,这是动画,所以它对我来说足够了。谢谢你的详细解释,罗伯!
func SelectObject( atPoint: NSPoint)
{
    let thePoint = atPoint as CGPoint
    if let hitLayer = itsCourseLayer.hitTest( thePoint) {
        if (hitLayer != itsCourseLayer) {
            // Gives following error:
            // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
            hitLayer.backgroundColor = NSColor.red.cgColor 
        }
    }
}
init(layer: CALayer) {
    let layer = layer as! CPCoursePointLayer
    // copy any custom properties from layer to self here
    super.init(layer: layer)
}
override class func defaultAction(forKey key: String) -> CAAction? {
    return unsafeBitCast(NSNull(), to: CAAction?.self)
}