作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
按照苹果文档,我试图通过它的两个构造函数方法设置一个简单的 NSTextView
。
我将下面的代码放在内容 View 的 View Controller 的 viewDidAppear
方法中。 textView 是 NSTextView
的实例,frameRect 是内容 View 的框架。
以下 Swift 代码有效(给我一个可编辑的 textView,文本显示在屏幕上):
textView = NSTextView(frame: frameRect!)
self.view.addSubview(textView)
textView.textStorage?.appendAttributedString(NSAttributedString(string: "Hello"))
以下不起作用( TextView 不可编辑且屏幕上不显示文本):
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
。
最佳答案
您需要保留对您创建的 NSTextStorage
变量的引用。我不太确定这一切的机制,但看起来 TextView 只保留对其文本存储对象的弱引用。一旦这个对象超出范围,它就不再可用于 TextView 。我想这与 MVC 设计模式保持一致,其中 View (在本例中为 NSTextView
)应该独立于它们的模型(NSTextStorage
对象)。
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"))
}
}
关于cocoa - 如何使用显式 NSLayoutManager、NSTextStorage、NSTextContainer 以编程方式设置 NSTextView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29035431/
我是一名优秀的程序员,十分优秀!