最大长度为UITextField
当我尝试过如何使用swift设置可以input到UITextField的最大字符数? ,我看到如果我使用全部10个字符,我也不能抹去字符。
我唯一能做的就是取消操作(一起删除所有的字符)。
有谁知道如何不阻止键盘(以便我不能添加其他字母/符号/数字,但我可以使用退格键)?
对于Swift 3,请尝试以下实现的属于UITextFieldDelegate
协议的textField(_:shouldChangeCharactersIn:replacementString:)
:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } let newLength = text.characters.count + string.characters.count - range.length return newLength <= 10 // Bool }
然而,根据你的需要,你可能更喜欢这个实现(更多细节参见Swift 2中的Strings ):
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } let newLength = text.utf16.count + string.utf16.count - range.length return newLength <= 10 // Bool }
下面的代码显示了如何在UIViewController
实现它:
import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! // Link this to a UITextField in your storyboard let limitLength = 10 override func viewDidLoad() { super.viewDidLoad() textField.delegate = self } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } let newLength = text.characters.count + string.characters.count - range.length return newLength <= limitLength } }
我这样做:
func checkMaxLength(textField: UITextField!, maxLength: Int) { if (countElements(textField.text!) > maxLength) { textField.deleteBackward() } }
代码适用于我。 但我使用故事板。 在故事板中,我在视图控制器中的文本字段中添加一个操作,以便编辑已更改的内容 。
从@Martin中添加更多详细的答案
// linked your button here @IBAction func mobileTFChanged(sender: AnyObject) { checkMaxLength(sender as! UITextField, maxLength: 10) } // linked your button here @IBAction func citizenTFChanged(sender: AnyObject) { checkMaxLength(sender as! UITextField, maxLength: 13) } func checkMaxLength(textField: UITextField!, maxLength: Int) { // swift 1.0 //if (count(textField.text!) > maxLength) { // textField.deleteBackward() //} // swift 2.0 if (textField.text!.characters.count > maxLength) { textField.deleteBackward() } }
func checkMaxLength(textField: UITextField!, maxLength: Int) { if (textField.text!.characters.count > maxLength) { textField.deleteBackward() } }
IOS 9的一个小改动
Swift 3
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let nsString = NSString(string: textField.text!) let newText = nsString.replacingCharacters(in: range, with: string) return newText.characters.count <= limitCount }
我发布了一个使用IBInspectable
的解决scheme,因此您可以在界面构build器中或以编程方式更改最大长度值。 看看这里
请注意本文提到的UITextField的撤消错误: 设置UITextField的最大字符长度
这里是你如何迅速修复它
if(range.length + range.location > count(textField.text)) { return false; }
Here is my version of code. Hope it helps! func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let invalidCharacters = NSCharacterSet(charactersInString: "0123456789").invertedSet if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex)) { return false } if (count(textField.text) > 10 && range.length == 0) { self.view.makeToast(message: "Amount entry is limited to ten digits", duration: 0.5, position: HRToastPositionCenter) return false } else { } return true }
我一直在使用这个协议/扩展在我的一个应用程序,它是更可读一点。 我喜欢如何识别退格,并明确告诉你什么时候退格。
有些事情要考虑:
无论该协议扩展需要什么实现来指定字符限制。 这通常是你的ViewController,但你可以实现字符限制作为一个计算的属性,并返回其他的东西,例如一个模型的字符限制。
2.您需要在文本字段的shouldChangeCharactersInRange委托方法内调用此方法。 否则,您将无法通过返回错误等来阻止文本input。
3.你可能想要允许退格字符通过。 这就是为什么我添加了额外的function来检测退格。 您的shouldChangeCharacters方法可以检查这一点,并尽早返回“true”,以便始终允许退格。
protocol TextEntryCharacterLimited{ var characterLimit:Int { get } } extension TextEntryCharacterLimited{ func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{ let startingLength = textField.text?.characters.count ?? 0 let lengthToAdd = string.characters.count let lengthToReplace = range.length let newLength = startingLength + lengthToAdd - lengthToReplace return newLength <= characterLimit } func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{ if range.length == 1 && string.characters.count == 0 { return true } return false } }
如果您有任何兴趣,我有一个Github回购,我已经采取了一些这种字符限制行为,并把它放到一个iOS框架。 有一个协议,你可以实现一个类似Twitter的字符限制显示,显示你已经超出了字符数限制。
Github上的CharacterLimited框架
由于委托是一对一的关系,我可能想在其他地方使用它,所以我喜欢限制在它们的设置中添加这个代码的文本字段长度:
required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)! setup() } required override init(frame: CGRect) { super.init(frame: frame) setup() } func setup() { // your setup... setMaxLength() } let maxLength = 10 private func setMaxLength() { addTarget(self, action: #selector(textfieldChanged(_:)), for: UIControlEvents.editingChanged) } @objc private func textfieldChanged(_ textField: UITextField) { guard let text = text else { return } let trimmed = text.characters.prefix(maxLength) self.text = String(trimmed) }
更新Swift 4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } let newLength = text.count + string.count - range.length return newLength <= 10 }
您需要检查现有string加上input是否大于10。
func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { NSUInteger newLength = textField.text.length + string.length - range.length; return !(newLength > 10) }