我有一个NSTextView子类,在这个子类的初始化器中,我想调用:
super.init(frame: NSMakeRect(...))在以编程方式初始化NSTextView时,我总是这样做的。我只是写:
let textView = NSTextView(frame: NSMakeRect(0,0,10,10))但是,当我在子类(super.init(frame: (...)))中这样做时,编译器会抛出一个错误。它不允许我使用init(frame:),因为init(frame:)是NSTextView的一个方便的初始化器,我必须调用“超类的指定初始化器”。
在检查了文档之后,我发现NSTextView的指定初始化程序是init(frame: textContainer:),但我不想处理NSTextContainers。为什么我必须从对象的子类中调用指定的初始化器,但是如果对象没有被子类化,我可以调用一个方便的初始化器。每当我通常初始化一个NSTextView时,我就不必提供一个NSTextContainer,但是当我将一个NSTextView初始化为一个子类的超类时,我就会提供它。为什么会这样呢?
另外,是否有任何方法可以使用某种“默认”文本容器初始化NSTextView?不管指定的初始化器是什么,我在这里要做的就是创建一个NSTextView,而不必担心NSTextContainers。
发布于 2016-01-09 16:21:51
我为这个找到了一份工作。这不漂亮,但它能完成任务。基本上,我只是在使用init(frame:)在子类初始化器中创建一个init(frame:)实例,然后将生成的textContainer应用于super
class Header: NSTextView {
// methods and properties...
init(frame theFrame: NSRect) {
// using desired convenience initializer
let test = NSTextView(frame: theFrame)
// using designated initializer, as required by the compiler
super.init(frame: test.frame, textContainer: test.textContainer)
}
}https://stackoverflow.com/questions/34616892
复制相似问题