在Swift中设置UITextField的最大字符长度

5 浏览
0 Comments

在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')

0
0 Comments

问题的出现原因:在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')”。

抱歉,我刚刚看到你的评论。我之前不知道有选中标记。我现在进行了检查和点赞,谢谢。

0