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

UITextField调用resignFirstResponder时attributedText高亮效果异常问题

问题根因

该问题是UITextField的typingAttributes属性的系统默认行为导致,与你的NSRange设置逻辑无关:

  • typingAttributes是UITextField用于控制新输入文本样式的属性,当文本框处于激活状态(键盘唤起)时,光标所在位置的字符样式会自动同步到typingAttributes中。
  • 你首次点击按钮给最后一个字符设置黄色背景后,再次点击文本框唤起键盘,光标默认停在文本末尾,此时typingAttributes就继承了最后一个字符的黄色背景属性。
  • 此时你再次点击按钮,系统会自动将当前的typingAttributes应用到整段文本,最终出现全部文本高亮的异常。
  • 你测试的两个正常场景的原因:
    • 不收起键盘时,系统不会触发将typingAttributes同步到全文本的逻辑
    • 高亮非最后一个字符时,光标所在的末尾位置字符样式为默认值,typingAttributes不会携带黄色背景属性,因此不会触发异常
修复方案

在设置属性文本前先清空typingAttributes即可解决,同时建议将收起键盘的逻辑放到属性文本设置完成之后,避免触发系统额外的样式同步逻辑,修改后代码如下:

private func highlightLast() {
    guard let text = textField.text, text.count > 1 else {
        return
    }
    // 清空输入属性,避免继承之前的字符样式
    textField.typingAttributes = [:]
    let attributedString = NSMutableAttributedString(string: text)
    attributedString.addAttribute(.backgroundColor, value: UIColor.yellow, range: NSRange(location: text.count - 1, length: 1))
    textField.attributedText = attributedString
    textField.resignFirstResponder()
}

如果你的文本框支持用户手动输入,也可以在textFieldDidBeginEditing代理方法中统一清空typingAttributes,避免其他场景出现类似样式异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:15:04