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
相关产品推荐
相关产品推荐

