【问题标题】:Initialize subclass of NSTextView without providing NSTextContainer在不提供 NSTextContainer 的情况下初始化 NSTextView 的子类
【发布时间】:2016-01-05 16:46:20
【问题描述】:

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

【问题讨论】:

标签: swift initialization designated-initializer convenience-methods


【解决方案1】:

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

}

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多