如何修改NSTextView中全部文本的颜色?代码问题咨询
解决NSTextView追加文本颜色不统一的问题
这问题我做Mac开发时也踩过类似的坑,咱们一步步拆解原因和解决方案:
为什么只有"Hello"变色,"World"不变?
你设置的myTextView.textColor = .white,其实是给textView的默认输入属性(也就是typingAttributes)添加了文字颜色。用string = "Hello"设置初始文本时,textView会自动把这个默认颜色应用上去;但直接操作textStorage?.append(NSAttributedString(string: "World"))时,你追加的是一个没有任何属性的纯字符串,它不会自动继承textView的textColor,所以会用系统默认的黑色显示。
解决方案:两种方式实现自动继承颜色
方式一:用textView的insertText:方法追加(推荐)
这个方法会自动使用textView当前的typingAttributes(包含你设置的白色),不用手动处理属性:
override func viewDidLoad() { super.viewDidLoad() myTextView.string = "Hello" myTextView.backgroundColor = .black myTextView.textColor = .white // 改用insertText,自动继承textColor myTextView.insertText("World") }
方式二:基于textView的默认属性创建富文本再追加
如果你一定要直接操作textStorage,可以先获取textView的typingAttributes,用它来创建带属性的字符串,这样就不用每次手动写颜色了:
override func viewDidLoad() { super.viewDidLoad() myTextView.string = "Hello" myTextView.backgroundColor = .black myTextView.textColor = .white // 获取当前的默认输入属性(包含textColor) let defaultAttrs = myTextView.typingAttributes let attrString = NSAttributedString(string: "World", attributes: defaultAttrs) myTextView.textStorage?.append(attrString) }
关于追加文本方式的小建议
直接操作textStorage本身是没问题的,它是NSTextView管理富文本的核心对象,但要注意:如果追加的是无属性的纯字符串,会使用系统默认样式。如果想让后续追加的文本都自动继承当前textView的样式,优先用insertText:方法,或者基于typingAttributes创建富文本,这样就不用每次手动指定颜色啦。
内容的提问来源于stack exchange,提问作者vincentf




