Swift中如何实现UITextField超出限制的额外字符变色且删除时恢复
解决方案
一、UITextField超出限制字符单独标红实现
你的原有代码直接修改了textColor属性,会统一修改全部文本颜色,要实现部分字符变色需要使用**富文本(NSAttributedString)**实现,修改后的checkRemainingChars方法如下:
func checkRemainingChars() { let allowedChars = 10 let totalCount = inputLimitField.text?.count ?? 0 let remainingChars = allowedChars - totalCount // 先保存当前光标位置,避免修改富文本后光标跳转到末尾 let selectedRange = inputLimitField.selectedTextRange // 初始化富文本 let attributedStr = NSMutableAttributedString(string: inputLimitField.text ?? "") // 全部文本默认颜色 attributedStr.addAttribute(.foregroundColor, value: UIColor.black, range: NSRange(location: 0, length: totalCount)) characterCountLabel.textColor = .black inputLimitField.layer.borderColor = UIColor.systemGray3.cgColor inputLimitField.layer.cornerRadius = 6.0 inputLimitField.layer.borderWidth = 1.0 if remainingChars < 0 { // 超出部分单独设为红色 let overRange = NSRange(location: allowedChars, length: totalCount - allowedChars) attributedStr.addAttribute(.foregroundColor, value: UIColor.red, range: overRange) characterCountLabel.textColor = .red inputLimitField.layer.borderColor = UIColor.red.cgColor } // 赋值富文本 inputLimitField.attributedText = attributedStr // 恢复光标位置 inputLimitField.selectedTextRange = selectedRange characterCountLabel.text = ("\(remainingChars)/10") }
不需要修改其他代理方法,原有逻辑保留即可,删除超出字符时超出范围消失,红色会自动恢复。
二、No such module 'MaterialComponents'报错解决
这个库不是iOS系统自带的内置库,需要手动导入后才能使用,常见排查点:
- 确认你已经通过CocoaPods、Swift Package Manager等包管理工具将MaterialComponents库添加到项目中
- 如果你使用CocoaPods导入,执行完
pod install后必须打开后缀为.xcworkspace的项目文件,而不是原有的.xcodeproj文件,否则会找不到库 - 如果你不需要复杂的输入框样式,完全可以用现有的
characterCountLabel调整布局到输入框右上角,不需要额外引入第三方库,减少项目体积。
内容的提问来源于stack exchange,提问作者Sima
相关产品推荐
相关产品推荐

