gpt4 book ai didi

cocoa - 更改 CALayer 属性 : EXC_BAD_INSTRUCTION

转载 作者:行者123 更新时间:2023-12-03 16:53:41 25 4
gpt4 key购买 nike

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

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

她是我的函数,是从我的 NSView 子类的 mouseUp 函数调用的。

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
}
}
}

我还尝试了 hitLayer.setValue( NSColor.red.cgColor, forKeyPath: "backgroundColor") 并尝试用 CATransaction.begin() 包围它 em> 和 CATransaction.commit(),或更改子层的任何其他属性。但没有成功。

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

最佳答案

错误消息告诉您一种解决方案:在 CPCoursePointLayer 中实现 init(layer:)

当您在图层上设置属性时,并且该图层位于非隐藏窗口的图层树中,Core Animation 会通过发送 the actionForKey: message 来查找该属性的 CAAction到图层。如果该搜索返回nil,Core Animation 会使用一些默认参数为该属性创建隐式动画。

任何带有附加动画的图层都有相应的表示图层。 (阅读 Layer Trees Reflect Different Aspects of the Animation State 了解更多信息。)因此 Core Animation 需要为您的 hitLayer 创建相应的表示层。它使用 CPCoursePointLayer 类上的 init(layer:) 初始值设定项来执行此操作。

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

一种解决方案是将 init(layer:) 初始值设定项添加到 CPCoursePointLayer 类中:

init(layer: CALayer) {
let layer = layer as! CPCoursePointLayer
// copy any custom properties from layer to self here
super.init(layer: layer)
}

如果您定义init(layer:),那么您可以为图层的属性设置动画,并允许它们隐式动画。

如果您从不打算显式或隐式地为图层的属性设置动画,那么您可以在 Core Animation 搜索操作时返回 NSNull 来禁用隐式动画,例如将此方法添加到您的CPCoursePointLayer 类:

override class func defaultAction(forKey key: String) -> CAAction? {
return unsafeBitCast(NSNull(), to: CAAction?.self)
}

关于cocoa - 更改 CALayer 属性 : EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com