2

我有一个子类NSTextView,在这个子类的初始化程序中,我想调用:

super.init(frame: NSMakeRect(...))

这是我在以NSTextView编程方式初始化时总是做的事情。我简单地写:

let textView = NSTextView(frame: NSMakeRect(0,0,10,10))

但是,当我在子类 ( super.init(frame: (...))) 中执行此操作时,编译器会引发错误。它不会让我使用init(frame:),因为init(frame:)它是 的便利初始化器NSTextView,我必须调用“超类的指定初始化器”。

检查文档后,我发现指定的初始化程序NSTextViewinit(frame: textContainer:)但我不想处理NSTextContainers. 为什么我必须从对象的子类调用指定的初始化程序,但如果对象没有被子类化,我可以调用便利初始化程序?每当我通常初始化 an时,NSTextView我不必提供 an NSTextContainer,但是当我将 an 初始化NSTextView为子类的超类时,我会提供。为什么是这样?

另外,有没有办法NSTextView用一种“默认”文本容器初始化一个?不管指定的初始化器如何,我在这里要做的就是创建一个NSTextView而不用担心NSTextContainers.

4

1 回答 1

5

我为此找到了一个工作。它不漂亮,但它完成了工作。基本上我只是NSTextView在我的子类初始化器内部创建一个实例,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) 
    }

}
于 2016-01-09T16:21:51.623 回答