我有一个带有标准的基本 Mac 应用程序NSTextView
。我正在尝试实现和使用 的子类NSTextStorage
,但即使是非常基本的实现也会破坏列表编辑行为:
- 我添加了一个包含两个项目的项目符号列表
- 我将该列表进一步复制并粘贴到文档中
- 在粘贴的列表中按 Enter 会中断最后一个列表项的格式。
这是一个快速视频:
两个问题:
- 粘贴列表的项目符号使用较小的字体大小
- 在第二个列表项后按 Enter 会破坏第三个项目
当我不替换文本存储时,这很好用。
这是我的代码:
ViewController.swift
@IBOutlet var textView:NSTextView!
override func viewDidLoad() {
[...]
textView.layoutManager?.replaceTextStorage(TestTextStorage())
}
TestTextStorage.swift
class TestTextStorage: NSTextStorage {
let backingStore = NSMutableAttributedString()
override var string: String {
return backingStore.string
}
override func attributes(at location: Int, effectiveRange range: NSRangePointer?) -> [NSAttributedString.Key:Any] {
return backingStore.attributes(at: location, effectiveRange: range)
}
override func replaceCharacters(in range: NSRange, with str: String) {
beginEditing()
backingStore.replaceCharacters(in: range, with:str)
edited(.editedCharacters, range: range,
changeInLength: (str as NSString).length - range.length)
endEditing()
}
override func setAttributes(_ attrs: [NSAttributedString.Key: Any]?, range: NSRange) {
beginEditing()
backingStore.setAttributes(attrs, range: range)
edited(.editedAttributes, range: range, changeInLength: 0)
endEditing()
}
}