首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式使用显式NSTextView、NSTextStorage、NSTextContainer设置一个NSTextStorage?

如何以编程方式使用显式NSTextView、NSTextStorage、NSTextContainer设置一个NSTextStorage?
EN

Stack Overflow用户
提问于 2015-03-13 14:55:45
回答 3查看 10.7K关注 0票数 11

在苹果文档之后,我试图通过它的两个构造函数方法来设置一个简单的NSTextView

我把下面的代码放在内容视图的视图控制器的viewDidAppear方法中。textView是NSTextView的一个实例,frameRect是内容视图的框架。

以下Swift代码工作正常(提供一个可编辑的textView,屏幕上显示文本):

代码语言:javascript
复制
    textView = NSTextView(frame: frameRect!)
    self.view.addSubview(textView)
    textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello"))

以下内容不起作用(文本视图不可编辑,屏幕上也不显示文本):

代码语言:javascript
复制
    var textStorage = NSTextStorage()
    var layoutManager = NSLayoutManager()
    textStorage.addLayoutManager(layoutManager)
    var textContainer = NSTextContainer(containerSize: frameRect!.size)
    layoutManager.addTextContainer(textContainer)
    textView = NSTextView(frame: frameRect!, textContainer: textContainer)

    textView.editable = true
    textView.selectable = true
    self.view.addSubview(textView)

    textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello more complex"))

,在第二个示例中,我做错了什么?我试图效仿苹果的“指南”中给出的例子,在指南中,他们讨论通过显式实例化NSTextView的帮助对象网络来设置它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-13 15:23:36

您需要保留对您创建的NSTextStorage变量的引用。我不太清楚这一切的机制,但看起来文本视图只保留了对其文本存储对象的弱引用。一旦这个对象超出了作用域,它就不再适用于文本视图。我想这与MVC设计模式是一致的,其中视图(在本例中是NSTextView )应该独立于它们的模型( NSTextStorage对象)。

代码语言:javascript
复制
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"))
    }
}
票数 12
EN

Stack Overflow用户

发布于 2021-03-25 08:52:24

在Xcode 12.4下测试。在操场上:

代码语言:javascript
复制
import Cocoa
import AppKit

let textViewFrame = CGRect(x: 0, y: 0, width: 250, height: 90)
let textStorage = NSTextStorage()
var layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
var textContainer = NSTextContainer(containerSize: textViewFrame.size)
layoutManager.addTextContainer(textContainer)
let textView = NSTextView(frame: textViewFrame, textContainer: textContainer)
textView.isEditable = true
textView.isSelectable = true
textView.textColor = NSColor.red
textView.string = "Why is this so complicated..."
票数 3
EN

Stack Overflow用户

发布于 2015-09-15 12:00:14

代码语言:javascript
复制
#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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29035431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档