【发布时间】:2015-03-13 14:55:45
【问题描述】:
按照苹果文档,我试图通过它的两个构造函数方法设置一个简单的NSTextView。
我将下面的代码放在内容视图的视图控制器的viewDidAppear 方法中。 textView 是NSTextView 的实例,frameRect 是内容视图的框架。
以下 Swift 代码可以工作(给我一个可编辑的 textView 并在屏幕上显示文本):
textView = NSTextView(frame: frameRect!)
self.view.addSubview(textView)
textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello"))
以下内容不起作用(文本视图不可编辑且屏幕上未显示文本):
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"))
我在第二个示例中做错了什么?我正在尝试遵循 Apple 的“Cocoa Text Architecture Guide”中给出的示例,他们讨论了通过显式实例化其帮助对象网络来设置 NSTextView。
【问题讨论】:
-
您是否保留了对
textStorage变量的引用? -
@PaulPatterson 现场!只是将 textStorage 的声明更改为类级别而不是本地级别,然后我就开始做生意了。请在下面弹出答案,以便我接受。我认为解释是局部变量在退出方法时被破坏,然后你有一个 textView,它有一个指向不存在的存储位置的指针?
-
没错。有趣的是,几个月前我花了大约一两个小时试图找出这个确切的问题 - 苹果应该在他们的指南中更明确一点。
标签: cocoa swift nstextview nslayoutmanager nstextstorage