在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”
-
您的视图控制器应符合
UITextFieldDelegate
,如下所示:class MyViewController: UIViewController, UITextFieldDelegate { }
-
设置你的文本的代表:
myTextField.delegate = self
- 在你的视图控制器中实现该方法:
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 } }
我有一些要添加到阿拉丁的答案:
-
你的视图控制器应符合
UITextFieldDelegate
class MyViewController: UIViewController, UITextViewDelegate { }
-
设置文本框的代表:要设置代表,可以控制从文本框拖到故事板中的视图控制器。 我认为这是最好的代码设置它
-
在您的视图控制器中实现该方法:
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 == "" }