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

后端 未结 2 1959
感动是毒
感动是毒 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"))
        }
    }
    
    0 讨论(0)
  • 2021-02-06 06:00
    #import <Cocoa/Cocoa.h>
    
    @interface TextViewController : NSObject {
    
        NSLayoutManager *secondLayout;
    
        IBOutlet NSSplitView *columnView;
        IBOutlet NSTextView *bottomView;
    
    }
    
    - (IBAction) addColumn: (id)sender;
    
    @end
    #import "TextViewController.h"
    
    @implementation TextViewController
    
    - (void)awakeFromNib
    {
        NSTextStorage *storage = [bottomView textStorage];
        secondLayout = [NSLayoutManager new];
        [storage addLayoutManager: secondLayout];
        [secondLayout release];
        [self addColumn: nil];
        [self addColumn: nil];
    }
    
    
    - (IBAction) addColumn: (id)sender
    {
        NSRect frame = [columnView frame];
    
        NSTextContainer *container = [[NSTextContainer alloc]
                                      initWithContainerSize: frame.size];
        [container setHeightTracksTextView: YES];
        [container setWidthTracksTextView: YES];
    
        [secondLayout addTextContainer: container];
        [container release];
        NSTextView *newView = [[NSTextView alloc] initWithFrame: frame
                                                  textContainer: container];
        [columnView addSubview: newView];
        [newView release];
    }
    
    @end
    
    0 讨论(0)
提交回复
热议问题