代码之家  ›  专栏  ›  技术社区  ›  bigelerow

在不提供NSTextContainer的情况下初始化NSTextView的子类

  •  3
  • bigelerow  · 技术社区  · 9 年前

    我有一个子类 NSTextView ,在这个子类的初始值设定项中,我想调用:

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

    这是我在初始化 NST文本视图 以编程方式。我简单地写道:

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

    然而,当我在子类中执行此操作时( super.init(frame: (...)) ),编译器抛出错误。它不会让我使用 init(frame:) 因为 初始化(帧:) 是的方便初始值设定项 NST文本视图 ,我必须调用“超类的指定初始值设定项”

    在检查文档后,我发现 NST文本视图 init(frame: textContainer:) 但我不想处理 NSTextContainers 为什么我必须从一个对象的子类中调用一个指定的初始值设定项,但如果对象没有被子类化,我可以调用一个方便的初始值设置项?每当我通常初始化 NST文本视图 我不需要提供 NSTextContainer ,但当我初始化 NST文本视图 作为子类的超类,我是这样做的。这是为什么?

    此外,是否有任何方法可以初始化 NST文本视图 使用某种“默认”文本容器?不管指定的初始值设定项如何,我只想在这里创建一个 NST文本视图 不用担心 NSText容器 .

    1 回复  |  直到 9 年前
        1
  •  8
  •   bigelerow    8 年前

    我为此找了一份工作。它不漂亮,但它能完成任务。基本上我只是创建一个 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) 
        }
    
    }