在Swift中设置UITextField的最大字符长度
在Swift中设置UITextField的最大字符长度
如何覆盖UITextField函数,以便对字符的最大数量进行限制?
我在Stack上进行了一些研究,但我只能找到下面的这个函数(见下文)。首先,我无法看出这如何是一个覆盖,其次,它使用的是NSRange作为参数,而我却有UITextRange。如何实现这个呢?谢谢。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
let currentString: NSString = textField.text! as NSString
let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
return newString.length <= 4
}
我的失败尝试:
override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool {
let currentString: NSString = self.text! as NSString
let newString: NSString = currentString.replacingCharacters(in: range, with: text) as NSString
return newString.length <= 4
}
错误:无法将类型'UITextRange'的值转换为'NSRange'的预期参数类型(即'_NSRange')
问题的出现原因:在Swift中设置UITextField的最大字符长度。
解决方法:可以通过子类化UITextField,在其中添加一个UIControlEvents editingChanged的目标。在选择器方法中,可以使用集合方法prefix来限制添加到textfield文本属性中的字符。
代码如下:
import UIKit
class LimitedLengthField: UITextField {
var maxLength: Int = 10
override func willMove(toSuperview newSuperview: UIView?) {
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
editingChanged()
}
func editingChanged() {
text = String(text!.prefix(maxLength))
}
}
可以通过编程或使用界面构建器添加自定义文本字段。
代码如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let limitedLenghtField = LimitedLengthField(frame: CGRect(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 200, height: 50)))
limitedLenghtField.text = "123456789012345"
view.addSubview(limitedLenghtField)
}
}
有趣的是,你还回答了我另一个问题,即如何在#selector中添加带参数的函数。
你是指哪个问题?能给个链接吗?
你的建议很有效,我很高兴现在有一个可行的答案。但我仍然想知道如何更改我从SO复制的代码以匹配UITextField类中的shouldChangeText函数。我猜我所面临的唯一问题是一个使用UITextRange,另一个使用NSRange,它们不匹配。在编辑中可以看到我的失败尝试。我收到的错误是“Cannot convert value of type 'UITextRange' to expected argument type 'NSRange' (aka '_NSRange')”。
抱歉,我刚刚看到你的评论。我之前不知道有选中标记。我现在进行了检查和点赞,谢谢。