How to set up an NSTextView programmatically with explicit NSLayoutManager, NSTextStorage, NSTextContainer?

后端 未结 2 1964
感动是毒
感动是毒 2021-02-06 05:29

Following the apple documentation I am trying to set up a simple NSTextView via its two constructor methods.

I am placing the below code inside the v

2条回答
  •  太阳男子
    2021-02-06 05:34

    You need to keep a reference to the NSTextStorage variable you create. I'm not quite sure about the mechanics of it all, but it looks like the text view only keeps a weak reference to its text storage object. Once this object goes out of scope, it's no longer available to the text view. I guess this is in keeping with the MVC design pattern, where views (the NSTextView in this case) are meant to be independent of their models (the NSTextStorage object).

    import Cocoa
    
    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate {
    
        @IBOutlet weak var window: NSWindow!
    
        var textView: NSTextView!
        var textStorage: NSTextStorage! // STORE A REFERENCE
    
        func applicationDidFinishLaunching(aNotification: NSNotification) {
            var view = window.contentView as NSView
            textStorage = NSTextStorage()
            var layoutManager = NSLayoutManager()
            textStorage.addLayoutManager(layoutManager)
            var textContainer = NSTextContainer(containerSize: view.bounds.size)
            layoutManager.addTextContainer(textContainer)
            textView = NSTextView(frame: view.bounds, textContainer: textContainer)
    
            textView.editable = true
            textView.selectable = true
            view.addSubview(textView)
    
            textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello more complex"))
        }
    }
    

提交回复
热议问题