尝试子类化NSTextView:
class MYTextView : NSTextView {
init(frame frameRect: NSRect) {
super.init(frame: frameRect)
setup()
}
}
我收到此错误:Must call a designated initializer of the superclass 'NSTextView'
在此行:super.init(frame: frameRect)
。
根据文档Convenience initializers must call another initializer available in the same class.
。请参阅'初始化程序链接'下面:
https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_286
但对于NSTextViews,我得到的唯一指定内容是super.init(frame:, textContainer:)
& super.init(coder: coder)
& super.inti()
。 init(frame:)
做了一些我不愿意自己实施的设置。
有没有办法使用超级的便利初始化器?
答案 0 :(得分:5)
覆盖指定的初始化程序:
class MyTextView : NSTextView {
init(frame frameRect: NSRect, textContainer aTextContainer: NSTextContainer!) {
super.init(frame: frameRect, textContainer: aTextContainer)
setup();
}
func setup() {
...
}
}
var textView = MyTextView(frame: NSRect())
由于所有指定的初始化程序都被覆盖,因此所有便利都将自动继承。
还有两个指定的初始值要覆盖:
init() {
}
和
init(coder:) {
}
答案 1 :(得分:0)
我刚被这个确切的问题绊倒了。我仍然使用继承棘手的Swift初始化,所以我绝对不可能在这里理解别的东西。
接受的答案似乎表明覆盖init(frame: textContainer:)
,init
和init(coder:)
会使init(frame:)
可以访问,但不适合我。
我能够按照自己的意愿工作的唯一方法是:
override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
super.init(frame: frameRect, textContainer: container)
setup()
}
override init(frame frameRect: NSRect) {
// this will end up calling init(frame:textContainer:)
super.init(frame: frameRect)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}