初始化NSTextView的子类而不提供NSTextContainer

时间:2016-01-05 16:46:20

标签: swift initialization designated-initializer convenience-methods

我有一个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

1 个答案:

答案 0 :(得分:3)

我为此找到了一份工作。它不漂亮,但它完成了工作。基本上我只是使用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) 
    }

}