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

我知道还有其他的话题,但我似乎无法find如何实现它。

我试图限制一个UITextField只有5个字符

优选字母数字和 – 和。 和_

我见过这个代码

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let maxLength = 4 let currentString: NSString = textField.text let newString: NSString = currentString.stringByReplacingCharactersInRange(range, withString: string) return newString.length <= maxLength } 

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let length = count(textField.text.utf16) + count(string.utf16) - range.length return length <= 10 } 

我只是不知道如何实际执行它,或者我应该换掉我的自定义名为UITextField的“textfield”

  1. 您的视图控制器应符合UITextFieldDelegate ,如下所示:

     class MyViewController: UIViewController, UITextFieldDelegate { } 
  2. 设置你的文本的代表: myTextField.delegate = self

  3. 在你的视图控制器中实现该方法: textField(_:shouldChangeCharactersInRange:replacementString:)

全部一起:

 class MyViewController: UIViewController,UITextFieldDelegate //set delegate to class @IBOutlet var mytextField: UITextField // textfield variable override func viewDidLoad() { super.viewDidLoad() mytextField.delegate = self //set delegate } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let maxLength = 4 let currentString: NSString = textField.text let newString: NSString = currentString.stringByReplacingCharactersInRange(range, withString: string) return newString.length <= maxLength } 

对于Swift 4

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let maxLength = 1 let currentString: NSString = textField.text! as NSString let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString return newString.length <= maxLength } 

只允许将指定的一组字符input到给定的文本字段中

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { var result = true if mytextField == numberField { if count(string) > 0 { let disallowedCharacterSet = NSCharacterSet(charactersInString: "0123456789.-").invertedSet let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil result = replacementStringIsLegal } } return result } 

如何编程只有数字input最大长度的iOS文本字段

2017年

2017年12月。斯威夫特4。

所有的示例代码都是过时的。

只需将以下内容粘贴到项目中的任何Swift文件中。 (您可以命名文件,例如“Handy.swift”)

这终于修复了iOS中最愚蠢的问题之一:

在这里输入图像说明

您的文本字段现在有一个.maxLength

在故事板中设置该值完全可以,或者将其设置为代码。

 // simply have this in a file called, say, Handy.swift or TextUtility.swift 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) } } func fix(textField: UITextField) { let t = textField.text textField.text = t?.safelyLimitedTo(length: maxLength) } } extension String { func safelyLimitedTo(length n: Int)->String { if (self.count <= n) { return self } return String( Array(self).prefix(upTo: n) ) } } 

就这么简单。


(注意:“safelyLimitedTo#length”只是一个调整string长度的调用,几乎所有的Swift程序员都有自己的函数,或者你可以在那里使用它)。

只是顺便说一句,这是一个类似的,非常有用的提示有关UIText 查看 , https: //stackoverflow.com/a/42333832/294884

Steven Schmatz也是这样做的,但是使用了Swift 3.0:

 //max Length func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let maxLength = 4 let currentString: NSString = textField.text! as NSString let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString return newString.length <= maxLength } 

我认为扩展更方便。 在这里看完整的答案

 private var maxLengths = [UITextField: Int]() // 2 extension UITextField { // 3 @IBInspectable var maxLength: Int { get { // 4 guard let length = maxLengths[self] else { return Int.max } return length } set { maxLengths[self] = newValue // 5 addTarget( self, action: #selector(limitLength), forControlEvents: UIControlEvents.EditingChanged ) } } func limitLength(textField: UITextField) { // 6 guard let prospectiveText = textField.text where prospectiveText.characters.count > maxLength else { return } let selection = selectedTextRange // 7 text = prospectiveText.substringWithRange( Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength)) ) selectedTextRange = selection } } 

我有一些要添加到阿拉丁的答案:

  1. 你的视图控制器应符合UITextFieldDelegate

     class MyViewController: UIViewController, UITextViewDelegate { } 
  2. 设置文本框的代表:要设置代表,可以控制从文本框拖到故事板中的视图控制器。 我认为这是最好的代码设置它

  3. 在您的视图控制器中实现该方法: textField(_:shouldChangeCharactersInRange:replacementString:)

这是一个Swift 3.2+替代方法,可以避免不必要的string操作。 在这种情况下,最大长度是10:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let text = textField.text ?? "" return text.count - range.length + string.count <= 10 } 

这个答案适用于Swift 4,并且非常简单,能够退格。

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { return (textField.text?.count ?? 0) < 10 || string == "" }