我有以下类,它是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)
我还在下面列出了堆栈跟踪的图像。
答案 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
}
}