当我在深色模式下构建 macOS 应用程序时,我的一些 TextView (NSTextView) 在几乎黑色的背景上呈现黑色文本。在界面生成器的属性检查器中,“文本颜色”设置为系统“默认(文本颜色)”,我认为这是正确的。事实上,在 Interface Builder 中,该文本根据需要在深色模式下呈现白色,在浅色模式下呈现黑色。我已经在代码中搜索了任何可能以编程方式将此 View 中的文本颜色设置为黑色的行,但找不到任何行。为什么我的文字总是黑色?
最佳答案
我注意到错误的 TextView 将其“属性字符串”与 Cocoa Bindings 绑定(bind)到返回普通的、非属性 NSString 对象的方法。我这样做可能是因为几年前我编写这个应用程序时很懒,而且它运行得很好。事实证明,这种不匹配就是问题所在。修复方法是修改这些方法以返回 NSAttributedString,其中包含键/值对的属性字典
NSForegroundColorAttributeName : NSColor.controlTextColor
可能发生的情况是,当属性字符串绑定(bind)获取非属性字符串时,Cocoa 被设计为做您可能想要的事情。 Cocoa 没有抛出异常,而是应用了一些“默认”属性,其中包括自 1984 年以来一直是 macOS 默认值的黑色文本颜色 - 在深色模式出现之前完全合理!好吧,苹果公司将默认值从黑色更改为 controlTextColor 可能会很好,但显然他们没有这样做。
结论:我们无法再将 TextView 的属性字符串绑定(bind)到普通的非属性字符串。
或者,您可以使用@Ely的答案并绑定(bind)到value
。但是,如果您尝试这样做,并且在绑定(bind)检查器中没有看到 value
绑定(bind),但确实看到了 data
绑定(bind),那是因为 NSTextField 文档中的这些注释:
[value
] 绑定(bind)仅在 NSTextView 配置为使用单一字体显示时可用。
及以后
[data
] 绑定(bind)仅在 NSTextView 配置为允许多种字体时可用。
它的意思是配置为允许多种字体是,在属性检查器中,允许富文本复选框处于启用状态。相反,配置为使用单一字体显示意味着允许富文本复选框处于关闭状态。
关于cocoa - NSTextView 在深色模式下在几乎黑色上绘制黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829249/