使用Swift子类化SKLabelNode错误

时间:2015-03-12 14:29:10

标签: swift sprite-kit

我有以下类,它是SKLabelNode的子类。没有

,这个课程将无法运作
override init(){
        super.init()
    }

呼叫。似乎SKLabelNode试图在没有参数的情况下调用init()方法,或者在导致此问题的地方发生其他事情。

这是简化的课程。

import UIKit
import SpriteKit

class PulsatingText: SKLabelNode {

    override init(){
        super.init()
    }

    init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){
        super.init(fontNamed: fontNamed)
        self.text = theText
        self.fontSize = theFontSize
    }


    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

如果我删除

override init(){
            super.init()
        }

我收到运行时崩溃,并将以下错误记录到控制台。

致命错误:使用未实现的初始化程序' init()' for class' MobileTutsInvaderz.PulsatingText'

以下是我如何调用该方法。

让invaderText = PulsatingText(fontNamed:" ChalkDuster&#34 ;,Text:" INVADERZ",theFontSize:50)

我还在下面列出了堆栈跟踪的图像。

,

2 个答案:

答案 0 :(得分:2)

您需要初始化init()方法。因为每次初始化init()时都会调用默认的SKLabelNode方法。您可以通过实施override init()来测试它,并添加println语句,如下所示:

override init() {
    super.init()
    println("test")
}

如果您现在初始化类似的标签节点:

var label:PulsatingText = PulsatingText(fontNamed: "Arial", theText: "hey", theFontSize: 12)

println("test")将被调用。

答案 1 :(得分:1)

由于您只想添加convenience初始值设定项并保持原样,因此您不需要覆盖指定的初始值设定项。所以只需改变你的代码:

class PulsatingText: SKLabelNode {

    convenience init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){
        self.init(fontNamed: fontNamed)
        self.text = theText
        self.fontSize = theFontSize
    }
}