使用IBInspectable在UITextField中创建最大字符长度
使用IBInspectable在UITextField中创建最大字符长度
我想通过IBInspectable
为我的文本框创建一个最大长度,我在一个问题here上看到了一个答案,但是我得到了一个错误,错误信息是Expression type '()' is ambiguous without more context
,
我的代码是
import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let l = __maxLengths[self] else {
return 150 // (global default-limit. or just, Int.max)
}
return l
}
set {
__maxLengths[self] = newValue
addTarget(self, action: #selector(fix), for: .editingChanged)
}
}
@objc func fix(textField: UITextField) {
let t = textField.text
textField.text = t?.prefix(maxLength)
}
}
我得到一个错误,指向textField.text = t?.prefix(maxLength)
,错误信息是Expression type '()' is ambiguous without more context
,
我该如何解决它?
问题出现的原因是,在Swift 5中,String的prefix方法返回的是一个String.SubSequence类型的值,而不是String类型。所以需要将其转换为String类型。
解决方法是将String.SubSequence类型的值转换为String类型。可以通过以下方式实现:
let s = textField.text!.prefix(maxLength)
textField.text = String(s)
或者使用单行解决方案:
textField.text = String(textField.text!.prefix(maxLength))
另外,需要注意的是,UITextField的text属性的默认值是一个空字符串,因此将其定义为可选类型是没有意义的。UITextField的text属性值永远不会是nil。
感谢你提醒我。"Jump to definition"操作显示UITextField代码中的注释似乎已经过时了。我会编辑答案。