在不提供 NSTextContainer 的情况下初始化 NSTextView 的子类
Initialize subclass of NSTextView without providing NSTextContainer
我有一个 NSTextView
的子类,在这个子类的初始化程序中我想调用:
super.init(frame: NSMakeRect(...))
这是我在以编程方式初始化 NSTextView
时经常做的事情。我简单的写:
let textView = NSTextView(frame: NSMakeRect(0,0,10,10))
但是,当我在我的子类 (super.init(frame: (...))
) 中执行此操作时,编译器会抛出错误。它不会让我使用 init(frame:)
因为 init(frame:)
是 NSTextView
的便利初始值设定项,我必须在检查后调用 "a designated initializer of the superclass."
在文档中,我发现 NSTextView
的指定初始值设定项是 init(frame: textContainer:)
但我不想处理 NSTextContainers
。为什么我必须从对象的子类中调用指定的初始化器,但如果对象没有被子类化,我可以调用便利的初始化器?每当我通常初始化一个 NSTextView
时,我不必提供一个 NSTextContainer
,但是当我将一个 NSTextView
初始化为子类的超类时,我需要提供。这是为什么?
此外,有没有什么方法可以用某种 "default" 文本容器来初始化 NSTextView
?不管指定的初始值设定项如何,我在这里要做的就是创建一个 NSTextView
而不必担心 NSTextContainers
.
我为此找了一个工作。它不漂亮,但它完成了工作。基本上,我只是使用 init(frame:)
在我的子类初始值设定项中创建一个 NSTextView
的实例,然后将结果 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)
}
}
我有一个 NSTextView
的子类,在这个子类的初始化程序中我想调用:
super.init(frame: NSMakeRect(...))
这是我在以编程方式初始化 NSTextView
时经常做的事情。我简单的写:
let textView = NSTextView(frame: NSMakeRect(0,0,10,10))
但是,当我在我的子类 (super.init(frame: (...))
) 中执行此操作时,编译器会抛出错误。它不会让我使用 init(frame:)
因为 init(frame:)
是 NSTextView
的便利初始值设定项,我必须在检查后调用 "a designated initializer of the superclass."
在文档中,我发现 NSTextView
的指定初始值设定项是 init(frame: textContainer:)
但我不想处理 NSTextContainers
。为什么我必须从对象的子类中调用指定的初始化器,但如果对象没有被子类化,我可以调用便利的初始化器?每当我通常初始化一个 NSTextView
时,我不必提供一个 NSTextContainer
,但是当我将一个 NSTextView
初始化为子类的超类时,我需要提供。这是为什么?
此外,有没有什么方法可以用某种 "default" 文本容器来初始化 NSTextView
?不管指定的初始值设定项如何,我在这里要做的就是创建一个 NSTextView
而不必担心 NSTextContainers
.
我为此找了一个工作。它不漂亮,但它完成了工作。基本上,我只是使用 init(frame:)
在我的子类初始值设定项中创建一个 NSTextView
的实例,然后将结果 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)
}
}