在 NSAttributedString 中用另一个替换 NSColor

Replacing NSColor with another in NSAttributedString

我正在尝试将 NSAttributedString 中的一种颜色替换为另一种颜色,以在 Mojave 之前的应用程序中启用暗模式。我有一个很长的 NSTextView 来保存字符串。

是否有任何方法可以重新映射或改变已在 NSTextView 中设置的颜色,类似于 Mojave 暗模式对 NSColor.textColor 所做的?如果打开多个文档,通过逐一枚举范围和属性来格式化字符串非常慢。

非常感谢使用 Swift 或 Objective-C 的提示和技巧!

简答:制作你自己的 "adaptable" 颜色。

长答案

  • 创建一个 NSColor 的子class,它有两个只读的(为了与 NSColor 是不可变的)实例 NSColor 属性 标准色和深色。

  • 给get/set加一个class属性应该用哪个颜色

  • 定义您自己的 init/new 方法,这些方法采用基本的标准颜色和深色。

  • NSColor 的所有创建方法添加到您的颜色中 @interface 将它们全部标记为 NS_UNAVAILBLE – 这可以防止意外使用 他们。

  • 覆盖所有需要的方法 – 参见 NSColor.h(使用“跳转到 Definition” in Xcode 来打开它。每个重写只是直接指向 方法到适当的标准或深色。这只是一个 一堆样板代码。

  • 现在用你的子class给你的NSAttributedString上色。当你 希望切换模式使用 class 属性 切换所有颜色 即时重绘字符串。

HTH