设置UITextField的最大字符长度


Answers:


1029

尽管UITextField该类没有最大长度属性,但通过设置文本字段delegate并实现以下委托方法来获得此功能相对简单:

目标C

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

迅速

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

在文本字段更改之前,UITextField询问委托是否更改指定的文本。此时,文本字段尚未更改,因此,我们将减去当前长度和要插入的字符串长度(通过粘贴复制的文本或使用键盘键入单个字符)减去范围长度。如果此值太长(此示例中超过25个字符),则返回NO以禁止更改。

在文本字段的末尾输入单个字符时, range.location将会是当前字段的长度,并且range.length将为0,因为我们不会替换/删除任何内容。插入文本字段的中间仅表示一个不同的range.location字符,而粘贴多个字符仅表示其中string包含多个字符。

删除单个字符或剪切多个字符由a指定 range非零长度和一个空字符串指定。替换只是使用非空字符串的范围删除。

关于崩溃的“撤消”错误的说明

正如评论中提到的那样,存在一个错误 UITextField可能导致崩溃。

如果您粘贴到该字段中,但是验证实现阻止粘贴,则粘贴操作仍会记录在应用程序的撤消缓冲区中。然后,如果您触发撤消操作(通过摇动设备并确认撤消操作),则设备UITextField将尝试用空字符串替换它认为粘贴至其自身的字符串。这将崩溃,因为它实际上从未将字符串粘贴到自身中。它将尝试替换不存在的字符串的一部分。

幸运的是,您可以UITextField像这样保护自己免受杀戮。您只需要确保它建议替换的范围确实存在于当前字符串中即可。这就是上面的初始完整性检查所做的。

迅速3.0与复制和粘贴工作正常。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

希望对您有帮助。


7
通过用if(textField == _ssn){}包围这两行并添加return YES来找到解决方案。方法的末尾,它将允许所有其他UITextField接受文本而没有任何限制。好漂亮!
凯尔·克莱格

55
好的答案,但是三元运算符是多余的;您可以放下return newLength <= 25;
jowie

2
如果只希望文本不溢出到文本框的框架上,该怎么办?并非所有字符的宽度都一样,对吗?
Morkrom 2013年

2
@bcherry提到确实存在一个撤消错误-已UITextField在iPad iOS 8.1上进行了测试。(+1评论)。作者会为此加些什么,因为它是评分最高的答案?我很高兴进行编辑,但我的似乎经常遭到拒绝!:-)
Benjohn 2014年

8
@bherry在Swift中,对撤消情况的检查似乎破坏了emoji的输入。count(textField.text)是否实际上应为count(textField.text.utf16)以匹配范围内的objc / uikit报告(相对于Swift的字符串计数变量)?
rcw3

62

斯威夫特4

import UIKit

private var kAssociationKeyMaxLength: Int = 0

extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                return length
            } else {
                return Int.max
            }
        }
        set {
            objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
            addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
        }
    }

    @objc func checkMaxLength(textField: UITextField) {
        guard let prospectiveText = self.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange

        let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        let substring = prospectiveText[..<indexEndOfText]
        text = String(substring)

        selectedTextRange = selection
    }
}

编辑:内存泄漏问题已修复。

在此处输入图片说明


好主意Frouo!我在答案中对此进行了扩展,将maxLength修剪移动到String扩展,以便它也可以用于UITextView实例之类的东西,并在UITextField扩展中添加方便功能以利用这些String扩展。
Scott Gardner

1
通过保存对所有textview的引用(直到超级用户一直引用超级视图),此全局变量不会造成内存泄漏吗?
Ixx

3
@Ixx我已经进行了编辑,以解决您指出的问题和迅速的3。谢谢
Frouo

1
实现这一目标的最美丽方式!谢谢
Victor Choy '18

谁能提供给我它的客观版本
MRizwan33'4

56

谢谢你,八月!(帖子

这是我最终使用的代码:

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.text.length >= MAX_LENGTH && range.length == 0)
    {
        return NO; // return NO to not change text
    }
    else
    {return YES;}
}

19
不幸的是,此解决方案无法阻止用户将其复制粘贴到文本字段中,从而使他们绕过了限制。Sickpea的答案可以正确应对这种情况。
2012年

5
人们使用if语句返回“否”或“是”怎么办?试试这个:return!(textField.text.length> = MAX_LENGTH && range.length == 0);
马特·帕金斯

还是这个return textField.text.length < MAX_LENGTH || range.length != 0;
igrek

22

为了完成August的回答,可以对建议的功能进行实现(请参见UITextField的委托)。

我没有测试domness代码,但是如果用户达到限制,我的代码就不会卡住,它与新字符串兼容,可以替换为较小或相等的字符串。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //limit the size :
    int limit = 20;
    return !([textField.text length]>limit && [string length] > range.length);
}

17

您不能直接执行此操作- UITextField没有maxLength属性,但是可以设置UITextField's委托,然后使用:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

5
我同意,这是前进的最佳方法,但仍然有些破绽。向Apple提交错误报告,您希望查看其文本长度属性。我当然也对此感兴趣。
avocade

5
@avocade,这不是黑客:这是一个示例,其中您必须执行Apple应该为您完成的基本框架代码。iOS SDK中有很多示例。
Dan Rosenstark

13

通常,您会有多个长度不同的输入字段。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    int allowedLength;
    switch(textField.tag) {
        case 1: 
            allowedLength = MAXLENGTHNAME;      // triggered for input fields with tag = 1
            break;
        case 2:
            allowedLength = MAXLENGTHADDRESS;   // triggered for input fields with tag = 2
            break;
        default:
            allowedLength = MAXLENGTHDEFAULT;   // length default when no tag (=0) value =255
            break;
    }

    if (textField.text.length >= allowedLength && range.length == 0) {
        return NO; // Change not allowed
    } else {
        return YES; // Change allowed
    }
}

12

最好的方法是设置有关文本更改的通知。在您-awakeFromNib的视图控制器方法中,您需要:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];

然后在同一个类中添加:

- (void)limitTextField:(NSNotification *)note {
    int limit = 20;
    if ([[myTextField stringValue] length] > limit) {
        [myTextField setStringValue:[[myTextField stringValue] substringToIndex:limit]];
    }
}

然后将插座连接myTextField到您的插座,UITextField在达到极限后,它将不允许您添加更多字符。确保将其添加到您的dealloc方法中:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:myTextField];

尽管我这样做是为了删除错误> myTextField.text = [myTextField.text substringToIndex:limit];
路加福音

11

我创建了这个 UITextFieldLimit子类:

  • 支持多个文本字段
  • 设置文字长度限制
  • 防止粘贴
  • 在文本字段内显示左字符标签,在停止编辑时被隐藏。
  • 没有剩余字符时摇动动画。

从此GitHub存储库中获取UITextFieldLimit.hand UITextFieldLimit.m

https://github.com/JonathanGurebo/UITextFieldLimit

并开始测试!

标记您的故事板创建的UITextField,然后使用Identity Inspector将其链接到我的子类:

身份检查员

然后,您可以将其链接到IBOutlet并设置限制(默认值为10)。


您的ViewController.h文件应包含:(如果您不想修改设置,例如限制)

#import "UITextFieldLimit.h"

/.../

@property (weak, nonatomic) IBOutlet UITextFieldLimit *textFieldLimit; // <--Your IBOutlet

您的ViewController.m文件应为@synthesize textFieldLimit


在您的ViewController.m文件中设置文本长度限制:

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    [textFieldLimit setLimit:25];// <-- and you won't be able to put more than 25 characters in the TextField.
}

希望课程对您有所帮助。祝好运!


对于字符限制的少量需求,我认为添加您的课程太过分了。
Domness

仍然付出努力表示赞赏。
2014年

11

这应该足以解决问题(将4替换为您想要的限制)。只要确保在IB中添加委托即可。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
     return (newString.length<=4);
}

9

使用以下扩展名设置a UITextField和的最大字符长度UITextView

迅捷4.0

    private var kAssociationKeyMaxLength: Int = 0
    private var kAssociationKeyMaxLengthTextView: Int = 0
    extension UITextField {


        @IBInspectable var maxLength: Int {
            get {
                if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                    return length
                } else {
                    return Int.max
                }
            }
            set {
                objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
                addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
            }
        }

        @objc func checkMaxLength(textField: UITextField) {
            guard let prospectiveText = self.text,
                prospectiveText.count > maxLength
                else {
                    return
            }

            let selection = selectedTextRange

            let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
            let substring = prospectiveText[..<indexEndOfText]
            text = String(substring)

            selectedTextRange = selection
        }
    }

UITextView

extension UITextView:UITextViewDelegate {


        @IBInspectable var maxLength: Int {
            get {
                if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLengthTextView) as? Int {
                    return length
                } else {
                    return Int.max
                }
            }
            set {
                self.delegate = self

                objc_setAssociatedObject(self, &kAssociationKeyMaxLengthTextView, newValue, .OBJC_ASSOCIATION_RETAIN)
            }
        }

        public func textViewDidChange(_ textView: UITextView) {
            checkMaxLength(textField: self)
        }
        @objc func checkMaxLength(textField: UITextView) {
            guard let prospectiveText = self.text,
                prospectiveText.count > maxLength
                else {
                    return
            }

            let selection = selectedTextRange

            let indexEndOfText = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
            let substring = prospectiveText[..<indexEndOfText]
            text = String(substring)

            selectedTextRange = selection
        }
    }

您可以在下面设置限制。

在此处输入图片说明


迄今为止最好的答案,,,当有许多需要不同长度的文本字段时,谢谢您的出色解决方案
Carlos Norena

对于textfield和textview控制字符输入限制来说,这是一个非常好的解决方案。它也为开发人员节省了代码行和时间... :)
Sandip Patel-SM

这比我发现的其他解决方案更好。例如,如果您的文本字段中有表情符号,则在编辑时,我发现的其他扩展名将跳至行尾。但是您的代码无法做到这一点。谢谢!
Phontaine Judd,

7

我模拟了将要发生的实际字符串替换,以计算将来的字符串长度:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if([newString length] > maxLength)
       return NO;

    return YES;
}

7

Swift 3版本// *****这不适用于Swift 2.x!***** //

首先创建一个新的Swift文件:TextFieldMaxLength.swift,然后添加以下代码:

import UIKit

private var maxLengths = [UITextField: Int]()

extension UITextField {

   @IBInspectable var maxLength: Int {

      get {

          guard let length = maxLengths[self] 
             else {
                return Int.max
      }
      return length
   }
   set {
      maxLengths[self] = newValue
      addTarget(
         self,
         action: #selector(limitLength),
         for: UIControlEvents.editingChanged
      )
   }
}
func limitLength(textField: UITextField) {
    guard let prospectiveText = textField.text,
        prospectiveText.characters.count > maxLength
    else {
        return
    }

   let selection = selectedTextRange
   let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
   text = prospectiveText.substring(to: maxCharIndex)
   selectedTextRange = selection
   }
}

然后选择任何TextField时,都会在Storyboard中看到一个新字段(最大长度)

如果您还有其他问题,请查看此链接:http : //www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -最大长度的视觉工作室风格/


警告,此全局变量通过持有对所有textview的引用而导致内存泄漏。
frouo

6

使用“界面构建器”,您可以在任何函数中链接并获取“编辑已更改”事件。现在您可以检查长度

- (IBAction)onValueChange:(id)sender 
{
    NSString *text = nil;
    int MAX_LENGTH = 20;
    switch ([sender tag] ) 
    {
        case 1: 
        {
            text = myEditField.text;
            if (MAX_LENGTH < [text length]) {
                myEditField.text = [text substringToIndex:MAX_LENGTH];
            }
        }
            break;
        default:
            break;
    }

}

6

以下代码与镰刀的答案相似,但可以正确处理复制粘贴操作。如果您尝试粘贴长度超过限制的文本,下面的代码将截断文本以适合限制,而不是完全拒绝粘贴操作。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    static const NSUInteger limit = 70; // we limit to 70 characters
    NSUInteger allowedLength = limit - [textField.text length] + range.length;
    if (string.length > allowedLength) {
        if (string.length > 1) {
            // get at least the part of the new string that fits
            NSString *limitedString = [string substringToIndex:allowedLength];
            NSMutableString *newString = [textField.text mutableCopy];
            [newString replaceCharactersInRange:range withString:limitedString];
            textField.text = newString;
        }
        return NO;
    } else {
        return YES;
    }
}

6

通用的解决方案可以在Swift中设置最大长度。通过IBInspectable,您可以在Xcode属性检查器中添加新的属性。在此处输入图片说明

import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            guard let length = maxLengths[self]
            else {
                return Int.max
            }
            return length
        }
        set {
            maxLengths[self] = newValue
            addTarget(
                self,
                action: Selector("limitLength:"),
                forControlEvents: UIControlEvents.EditingChanged
            )
        }
    }

    func limitLength(textField: UITextField) {
        guard let prospectiveText = textField.text
            where prospectiveText.characters.count > maxLength else {
                return
        }
        let selection = selectedTextRange
        text = prospectiveText.substringWithRange(
            Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength))
        )
        selectedTextRange = selection
    }

}

干净完美的解决方案
Eduardo

即使在关闭UIViewController之后,将UITextField保留在全局字段中也会将它们保留在内存中。这是内存泄漏。不要使用此方法。
Gunhan

5

为了使它可以剪切和粘贴任何长度的字符串,我建议将函数更改为:

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSInteger insertDelta = string.length - range.length;

        if (textField.text.length + insertDelta > MAX_LENGTH)
        {
           return NO; // the new string would be longer than MAX_LENGTH
        }
        else {
            return YES;
        }
    }

4

斯威夫特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
}

为什么guard呢?
oddRaven

检查文本是否为零,如果需要,还可以使用@oddRaven
Shan Ye

3

迅捷2.0 +

首先,为此过程创建一个类。让我们称之为StringValidator.swift。

然后,将以下代码粘贴到其中即可。

import Foundation

extension String {

func containsCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) != nil
}

func containsOnlyCharactersIn(matchCharacters: String) -> Bool {
let disallowedCharacterSet = NSCharacterSet(charactersInString: matchCharacters).invertedSet
return self.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
}


func doesNotContainCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) == nil
}

func isNumeric() -> Bool
{
let scanner = NSScanner(string: self)
scanner.locale = NSLocale.currentLocale()

return scanner.scanDecimal(nil) && scanner.atEnd
}

}

现在保存课程.....

用法..

现在转到您的viewController.swift类,并将文本字段的出口设置为..

@IBOutlet weak var contactEntryTxtFld: UITextField! //First textfield
@IBOutlet weak var contactEntryTxtFld2: UITextField!   //Second textfield

现在转到文本字段的shouldChangeCharactersInRange方法,并使用如下所示的方法。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if string.characters.count == 0 {
        return true
    }
    let latestText = textField.text ?? ""
    let checkAbleText = (latestText as NSString).stringByReplacingCharactersInRange(range, withString: string)


    switch textField {

    case contactEntryTxtFld:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    case contactEntryTxtFld2:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    default:
        return true
    }

}

不要忘记设置文本字段的委托协议/方法。

让我解释一下...我正在使用我在另一个类中编写的字符串的简单扩展过程。现在,我只是通过添加检查和最大值从其他需要它们的类中调用这些扩展方法。

特征...

  1. 它将设置特定文本字段的最大限制。
  2. 它将为特定文本字段设置接受键的类型。

类型...

containsOnlyCharactersIn //仅接受字符。

containsCharactersIn //接受字符组合

didNotContainsCharactersIn //不接受字符

希望对您有所帮助。


3

迅捷3.0

当您粘贴的字符串超出字符限制时,此代码可以正常工作。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

感谢您的投票。:)


2
UITextField,而不是UITextView。
乔尼

3

我根据@Frouo给出了补充答案。我认为他的回答是最美丽的方式。因为这是我们可以重用的通用控件。

private var kAssociationKeyMaxLength: Int = 0

extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                return length
            } else {
                return Int.max
            }
        }
        set {
            objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
            self.addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
        }
    }

    func checkMaxLength(textField: UITextField) {

        guard !self.isInputMethod(), let prospectiveText = self.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = prospectiveText.substring(to: maxCharIndex)
        selectedTextRange = selection
    }

    //The method is used to cancel the check when use Chinese Pinyin input method.
    //Becuase the alphabet also appears in the textfield when inputting, we should cancel the check.
    func isInputMethod() -> Bool {
        if let positionRange = self.markedTextRange {
            if let _ = self.position(from: positionRange.start, offset: 0) {
                return true
            }
        }
        return false
    }

}

2

这是处理UITextField上最大长度的正确方法,它允许返回键退出作为第一响应者退出的文本字段,并在达到限制时让用户退格

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int MAX_LENGHT = 5;
    if([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return FALSE;
    }
    else if(textField.text.length > MAX_LENGHT-1)
    {
        if([string isEqualToString:@""] && range.length == 1)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return TRUE;
    }
}

2

那么这个简单的方法呢?它对我来说很好。

extension UITextField {

    func  charactersLimit(to:Int) {

        if (self.text!.count > to) {
            self.deleteBackward()
        }
    }
}

然后:

someTextField.charactersLimit(to:16)

1

其他答案不能解决用户可以从剪贴板粘贴长字符串的情况。如果我粘贴一个长字符串,则应该将其截短但要显示出来。在您的代表中使用此命令:

static const NSUInteger maxNoOfCharacters = 5;

-(IBAction)textdidChange:(UITextField * )textField
{
NSString * text = textField.text;

if(text.length > maxNoOfCharacters)
{
    text = [text substringWithRange:NSMakeRange(0, maxNoOfCharacters)];
    textField.text = text;
}

// use 'text'

}

1

深入到1行代码:)

将文本视图的委托设置为“ self”,然后将<UITextViewDelegate>.h和以下代码添加到.m...。您可以将数字“ 7”调整为希望的最大字符数。

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return ((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length)>0);
}

此代码用于键入新字符,删除字符,选择字符,然后键入或删除,选择字符并剪切,一般地粘贴以及选择字符并粘贴。

做完了!






另外,使用位操作编写此代码的另一种很酷的方法是

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return 0^((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length));
}

1

我开源了一个UITextField子类STATextField,它通过其maxCharacterLength属性提供了此功能(以及更多)。


1

现在你要给几个字符

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range   replacementString:(NSString *)string {
     NSUInteger newLength = [textField.text length] + [string length] - range.length;
     return (newLength > 25) ? NO : YES;
  }

1

在此处使用此代码RESTRICTED_LENGTH是您要限制文本字段的长度。

   - (BOOL)textField:(UITextField *)textField     shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == nameTF) {
    int limit = RESTRICTED_LENGTH - 1;
    return !([textField.text length]>limit && [string length] > range.length);
    }
   else
   {
    return YES;
   }

return NO;

}

1

使用数字键盘时,我在Swift中做到了8个字符的限制。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return !(textField.text?.characters.count == MAX_LENGTH && string != "")
}

我必须测试字符串!=“”,以允许删除按钮在数字键盘上工作,否则,在达到最大值后,将不允许删除文本字段中的字符。


1

对于Xamarin:

YourTextField.ShouldChangeCharacters = 
delegate(UITextField textField, NSRange range, string replacementString)
        {
            return (range.Location + replacementString.Length) <= 4; // MaxLength == 4
        };

1

我已经实现了UITextField扩展,以向其中添加maxLength属性。

它基于Xcode 6 IBInspectables,因此您可以在“接口”构建器上设置maxLength限制。

这是实现:

UITextField + MaxLength.h

#import <UIKit/UIKit.h>

@interface UITextField_MaxLength : UITextField<UITextFieldDelegate>

@property (nonatomic)IBInspectable int textMaxLength;
@end

UITextField + MaxLength.m

#import "UITextField+MaxLength.h"

@interface UITextField_MaxLength()

@property (nonatomic, assign) id <UITextFieldDelegate> superDelegate;

@end

@implementation UITextField_MaxLength

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    //validate the length, only if it's set to a non zero value
    if (self.textMaxLength>0) {
        if(range.length + range.location > textField.text.length)
            return NO;

        if (textField.text.length+string.length - range.length>self.textMaxLength) {
            return NO;
        }
    }

    //if length validation was passed, query the super class to see if the delegate method is implemented there
    if (self.superDelegate && [self.superDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
        return [self.superDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
    }
    else{
        //if the super class does not implement the delegate method, simply return YES as the length validation was passed
        return YES;
    }
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    if (delegate == self)
        return;
    self.superDelegate = delegate;
    [super setDelegate:self];
}

//forward all non overriden delegate methods
- (id)forwardingTargetForSelector:(SEL)aSelector {
    if ([self.superDelegate  respondsToSelector:aSelector])
        return self.superDelegate;

    return [super forwardingTargetForSelector:aSelector];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    if ([self.superDelegate respondsToSelector:aSelector])
        return YES;

    return [super respondsToSelector:aSelector];
}
@end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.