如何将 uitextfield 字符范围限制为 10 位
Posted
技术标签:
【中文标题】如何将 uitextfield 字符范围限制为 10 位【英文标题】:how to limit uitextfield character range upto 10 digit 【发布时间】:2015-04-21 05:03:48 【问题描述】:我只想知道如何限制 uitextfield 范围,即我有一个文本框,我在其中输入 10 位数的值。如果我尝试输入超过 10 位数字,我的文本字段不应接受这些值。非常简单,我只想在文本字段中输入 10 位数字。
我编写了这段代码,但它对我不起作用:
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;
return newLength <= MAXLENGTH || returnKey;
【问题讨论】:
Set the maximum character length of a UITextField 的可能重复项 [This][1] 是我找到的最佳解决方案。 ***.com/questions/433337/…[1]:***.com/questions/433337/… 【参考方案1】:要限制文本输入的长度,请实现 UITextFieldDelegate 这个方法并在更改后检查文本的长度:
- (BOOL) textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
NSString *resultText = [textField.text stringByReplacingCharactersInRange:range
withString:string];
return resultText.length <= 10;
【讨论】:
【参考方案2】:在 Swift 3.0 中
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
let charsLimit = 10
let startingLength = textField.text?.characters.count ?? 0
let lengthToAdd = string.characters.count
let lengthToReplace = range.length
let newLength = startingLength + lengthToAdd - lengthToReplace
return newLength <= charsLimit
【讨论】:
【参考方案3】:试试下面限制为 10 个数字文本的代码。
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
NSInteger length = [textField.text length];
if (length>9 && ![string isEqualToString:@""])
return NO;
// This code will provide protection if user copy and paste more then 10 digit text
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
if ([textField.text length]>10)
textField.text = [textField.text substringToIndex:10];
);
return YES;
希望对您有所帮助。
【讨论】:
检查这个的原因是什么:![string isEqualToString:@""] ? 退格点击后将允许编辑。表示添加 10 位数字后,允许编辑该数字 允许用户粘贴一个大字符串然后裁剪它是很聪明的。可能有用。感谢您的方法。【参考方案4】:Swift 3 版本
func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool
let currentCharacterCount = textField.text?.characters.count ?? 0
if (range.length + range.location > currentCharacterCount)
return false
let newLength = currentCharacterCount + string.characters.count - range.length
return newLength <= 10
【讨论】:
【参考方案5】:试试这个。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
if(range.length + range.location > textField.text.length)
return NO;
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 10) ? NO : YES;
【讨论】:
【参考方案6】:你可以用这个……希望对你有帮助/
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
int lenght1 = code.text.length - range.length + string.length;
if (textField.text.length >= 4 && range.length == 0)
return NO;
【讨论】:
【参考方案7】:我构建了一个非常好的UITextField
子类来限制输入到字段中的字符数。给你!:
public class NumberFormattedTextField : UITextField
@IBInspectable public var maximumCharacters = 10
didSet
format()
public override func awakeFromNib()
format()
addTarget(self, action: "format", forControlEvents: .EditingChanged)
func format()
let len = text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
// truncate for max characters if needed
if len > maximumCharacters
text = text[1...maximumCharacters] // pulls in the last entered character and drops the first one off to preserve length
这取决于String
的下标。这也是:
public extension String
public subscript (r: Range<Int>) -> String?
let l = self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
if r.startIndex <= l && r.endIndex <= l
return substringWithRange(Range(start: advance(startIndex, r.startIndex), end: advance(startIndex, r.endIndex)))
else
return nil
【讨论】:
【参考方案8】:我已经根据Oxcug 给出的答案构建了一个子类,无需在字符串文件中创建扩展名,并且可以从情节提要和 swift 文件中设置最大字符长度。:
@IBDesignable class CustomTextField: UITextField
@IBInspectable var maximumCharacters: Int = 80
didSet
limitCharacters()
override func awakeFromNib()
super.awakeFromNib()
limitCharacters()
addTarget(self, action: #selector(CustomTextField.limitCharacters), for: .editingChanged)
func limitCharacters()
guard text != nil else
return
if (text?.characters.count)! > maximumCharacters
if let range = text?.index(before: (text?.endIndex)!)
text = text?.substring(to: range)
【讨论】:
【参考方案9】:最佳解决方案:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
return range.location < 10 //Here 10 is your character limit
【讨论】:
以上是关于如何将 uitextfield 字符范围限制为 10 位的主要内容,如果未能解决你的问题,请参考以下文章
无法将字符限制为 iOS 中 UITextField 内的字母数字 [重复]
如何根据 TextField 的可见大小限制 UITextField 的输入文本量?