Swift:animator()导致EXC_BAD_ACCESS

时间:2014-08-20 13:43:45

标签: animation swift

我注意到自测试版5以来在OS X 10.10下隐式动画的一些奇怪行为。 调用动画代理有时会导致应用程序崩溃。我设置了一个非常简单的自定义视图。这是完整的代码:

import Cocoa
import QuartzCore

class AnimatedView: NSView {

    var firstColor: NSColor = NSColor.blackColor() {
        didSet {
           self.needsDisplay = true
        }
    }

    var secondColor: NSColor = NSColor.whiteColor() {
        didSet {
            self.needsDisplay = true
        }
    }

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        let outerRect = self.bounds
        let halfW = outerRect.width / 4.0
        let halfH = outerRect.height / 4.0
        var innerRect = outerRect
        innerRect.inset(dx: halfW, dy: halfH)
        self.firstColor.set()
        NSRectFill(outerRect)
        self.secondColor.set()
        NSRectFill(innerRect)
    }

    override func animationForKey(key: String!) -> AnyObject! {
        switch key {
        case "firstColor", "secondColor" :
            return CABasicAnimation()
        default :
            return super.animationForKey(key)
        }
    }
}

如果我尝试动画NSView的ans祖先的属性,一切都像魅力一样。如:

animView.animator().frame = someFrame

如果我尝试为AnimatedView的属性设置动画,例如firstColor或secondColor:

animView.animator().firstColor = someColor
animView.animator().secondColor = someOtherColor

它崩溃了各种错误代码(尝试之间的代码没有变化):

  • EXC_BAD_ACCESS(代码= EXC_386_GPFLT)
  • EXC_BAD_ACCESS(code = 1,address = 0x ...)
  • EXC_BAD_ACCESS(代码= 2,地址= 0x ...)(地址通常为0x0)

没有对象是Nil(我已经检查了两次)。

有时会抱怨__CFString,有时它会在没有代码更改的情况下崩溃,但它永远不会有效......

我认为这是某种错误,但我必须在报告之前确定,或许我忘了一些。

1 个答案:

答案 0 :(得分:9)

重新阅读发行说明,注意到动态关键字,测试它,有效! 因此,如果要为自定义属性设置动画,则必须在属性声明中使用动态关键字:

dynamic var firstColor: NSColor = NSColor.blackColor() {
    didSet {
        self.needsDisplay = true
    }
}

dynamic var secondColor: NSColor = NSColor.whiteColor() {
    didSet {
        self.needsDisplay = true
    }
}

我不知道为什么它在测试版5之前有用,我不知道它是否是一个临时的解决方法,或者它是正常方式使用它但它的工作原理很好