You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让NSTextView正确显示AttributedString的属性样式?

自定义NSTextView无法渲染AttributedString颜色样式的问题

我通过NSViewRepresentable封装了一个自定义NSTextView:

struct CustomNSTextView: NSViewRepresentable {

    @Binding var text: AttributedString

    func makeNSView(context: Context) -> NSTextView {
        var textFrame: NSRect = NSRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 2, height: 50))
        var textView: NSTextView = NSTextView(frame: textFrame)
        textView.backgroundColor = .white
        return textView
    }

    func updateNSView(_ nsView: NSViewType, context: Context) {
        nsView.textStorage?.setAttributedString(NSAttributedString(text))
    }
}

接着我传入了一个带有蓝色标签样式的AttributedString:

struct PlaygroundView: View {
    @State private var test = transformText(string: "testing attributed string tag conversion. #tagging")

    var body: some View {
        CustomNSTextView(text: $test)
    }
}

func transformText(string: String) -> AttributedString {
    var aString = AttributedString(string)
    let splitString = string.split(separator: " ")
    let tags = splitString.filter { $0.hasPrefix("#") }.map(String.init)

    for tag in tags {
        if let range = aString.range(of: tag) {
            aString[range].foregroundColor = .blue
        }
    }

    return aString
}

预期字符串中的#tagging会显示为蓝色,但实际所有文本都是黑色。不过将该AttributedString传入SwiftUI原生Text组件时,样式可以正常显示:

NSTextView显示效果
SwiftUI Text显示效果

请问是不是遗漏了NSTextView的某些属性设置,才能让AttributedString正确渲染样式?


解决方法

问题根源在于NSTextView默认的textColor属性会覆盖富文本的颜色设置。当textColor不为nil时,NSTextView会将这个颜色统一应用到所有文本,忽略AttributedString中设置的局部颜色样式。

只需在创建NSTextView时,将textColor设为nil,让它遵循AttributedString中的样式即可:

func makeNSView(context: Context) -> NSTextView {
    let textFrame = NSRect(origin: .zero, size: CGSize(width: 2, height: 50))
    let textView = NSTextView(frame: textFrame)
    textView.backgroundColor = .white
    textView.textColor = nil // 关键设置:取消默认文本颜色的覆盖
    return textView
}

如果你的文本不需要编辑,还可以额外设置textView.isEditable = false,避免用户修改内容,但这不是解决颜色问题的必需项。

SwiftUI的Text组件本身会完全遵循AttributedString的样式定义,因此不会出现这种覆盖问题。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:55:16