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

NSAttributedString前景色设置仅生效一次,电话文本颜色未正常变更

搞定你的富文本样式问题

嘿,我一眼就看出问题出在哪了——你用的setAttributes(_:range:)方法其实是个「覆盖型选手」,它会完全替换指定范围内的所有现有属性,而不是给你追加新的样式。

看你代码的执行顺序:

  1. 你先给电话号码的范围设置了蓝色文字
  2. 紧接着又调用setAttributes只传了下划线样式,这一步直接把之前设置的蓝色属性给覆盖没了!结果电话号码的颜色就变回了默认(或者继承了前面文本的红色),只剩下下划线。

两种简单的解决办法

办法一:把属性打包一次设置

把颜色和下划线样式放进同一个字典,一次性调用setAttributes,这样就不会有覆盖的问题了:

let text = "call "
let phone = "1800-800-900"
let attrString = NSMutableAttributedString(string: text + phone, attributes: nil)
let rangeText = (attrString.string as NSString).range(of: text)
let rangePhone = (attrString.string as NSString).range(of: phone)

attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], range: rangeText)
// 把颜色和下划线属性合并到一个字典里
attrString.setAttributes([
    NSAttributedString.Key.foregroundColor: UIColor.blue,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
], range: rangePhone)

办法二:用addAttributes追加属性

如果你的业务逻辑需要分开设置属性(比如动态添加样式),那就别用setAttributes了,改用addAttributes(_:range:)——它只会新增或更新指定的属性,不会动已经存在的属性:

let text = "call "
let phone = "1800-800-900"
let attrString = NSMutableAttributedString(string: text + phone, attributes: nil)
let rangeText = (attrString.string as NSString).range(of: text)
let rangePhone = (attrString.string as NSString).range(of: phone)

attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], range: rangeText)
attrString.setAttributes([NSAttributedString.Key.foregroundColor: UIColor.blue], range: rangePhone)
// 用addAttributes追加下划线,不会覆盖已有的蓝色
attrString.addAttributes([NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue], range: rangePhone)

试一下这两种方法,电话号码就能同时显示蓝色和单下划线啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:19