来自界面构建器

时间:2017-09-21 16:53:54

标签: swift macos nstextview

我无法编辑nstextview。 这是我尝试的步骤。

  1. 在界面构建器中,我拖了一个"自定义视图"进入另一种观点。 (我在那里找不到nstextview。)
  2. 我更改了自定义视图表单的类" NSView"到" NSTextView"
  3. 接下来我运行我的项目,我可以看到文本视图被渲染(鼠标光标在鼠标悬停在文本视图区域时更改为文本模式)
  4. 但是,我无法插入/输入/编辑任何文字。
  5. 注意:我尝试过setEditable,setSelectable&设置其他帖子中推荐的firstResponder选项,但没有帮助。

1 个答案:

答案 0 :(得分:1)

问题在于,当您以上述方式使用Interface Builder时,NSTextView上的textStorage设置不正确。

我也想在InterfaceBuilder中使用不带scrollView的NSTextView。在Xcode 10中,似乎不可能在一个自定义视图层次结构中放置一个单独的NSTextView(早期答案暗示这是可能的:https://stackoverflow.com/a/2398980/978300)。

可以通过问题中的“ CustomView”方法使用此方法-但是,这将仅在“属性”检查器中具有简单的NSView属性(即,您将无法自定义字体等)。您可以在自定义类上使用@IBInspectable传递一些详细信息。

连接检查器似乎正常工作。

示例NSTextView子类...

class MyTextView: NSTextView
{
    // init(frame: sets up a default textStorage we want to mimic in init(coder:
    init() {
        super.init(frame: NSRect.zero)
        configure()
    }

    /*
     It is not possible to set up a lone NSTextView in Interface Builder, however you can set it up
     as a CustomView if you are happy to have all your presentation properties initialised
     programatically. This initialises an NSTextView as it would be with the default init...
     */
    required init(coder: NSCoder) {
        super.init(coder: coder)!

        let textStorage = NSTextStorage()
        let layoutManager = NSLayoutManager()
        textStorage.addLayoutManager(layoutManager)

        // By default, NSTextContainers do not track the bounds of the NSTextview
        let textContainer = NSTextContainer(containerSize: CGSize.zero)
        textContainer.widthTracksTextView = true
        textContainer.heightTracksTextView = true

        layoutManager.addTextContainer(textContainer)
        replaceTextContainer(textContainer)

        configure()
    }

    private func configure()
    {
        // Customise your text here...
    }
}