首页 文章

设置UITextField的最大字符长度

提问于
浏览
450

当我加载 UIView 时,如何在iPhone SDK上设置 UITextField 中的最大字符数?

30 回答

  • 56

    虽然 UITextField 类没有最大长度属性,但是's relatively simple to get this functionality by setting the text field' s delegate 并实现以下委托方法:

    Objective-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;
    }
    

    Swift

    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 <= 25
    }
    

    在文本字段更改之前,UITextField会询问委托是否应更改指定的文本 . 此时文本字段没有改变,所以我们 grab 它's current length and the string length we'重新插入(通过粘贴复制的文本或使用键盘键入单个字符),减去范围长度 . 如果此值太长(在此示例中超过25个字符),请返回 NO 以禁止更改 .

    在文本字段末尾键入单个字符时, range.location 将是当前字段的长度, range.length 将为0,因为我们不会替换/删除任何内容 . 插入文本字段的中间只是意味着不同的 range.location ,粘贴多个字符只意味着 string 中有多个字符 .

    删除单个字符或剪切多个字符由 range 指定,长度为非零,空字符串 . 替换只是一个非空字符串的范围删除 .

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

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

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

    幸运的是,你可以保护 UITextField 不会像这样自杀 . 您只需要确保它建议替换的范围确实存在于其当前字符串中 . 这是上面的初步健全检查 .

    swift 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
        }
    

    希望它对你有所帮助 .

  • 1

    谢谢八月! (Post

    这是我最终使用的代码:

    #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;}
    }
    
  • 13

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

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

    enter image description here

  • 5

    要完成 August 回答,可能实现建议的功能(参见UITextField's delegate) .

    我没有测试 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
    
  • 40

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

    - (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
        }
    }
    
  • 2

    最好的方法是设置文本更改通知 . 在您的视图控制器方法的 -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];
    
  • 1

    我创建了this UITextFieldLimit子类:

    • 支持多个文本字段

    • 设置文本长度限制

    • 粘贴预防

    • 在文本字段内显示左侧字符的标签,在停止编辑时隐藏 .

    • 没有剩下任何字符时摇动动画 .

    从这个GitHub存储库中抓取 UITextFieldLimit.hUITextFieldLimit.m

    https://github.com/JonathanGurebo/UITextFieldLimit

    并开始测试!

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

    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.
    }
    

    希望全班同学帮助你 . 祝好运!

  • 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);
    }
    
  • 0

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

    - (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;
    }
    
  • 2

    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中看到一个新字段(Max Length)

    如果您还有其他问题,请查看此链接:http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields-maximum-length-visual-studio-style/

  • 3

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

    - (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

    以下代码类似于sickp的答案,但处理正确的复制粘贴操作 . 如果您尝试粘贴长度超过限制的文本,以下代码将截断文本以适应限制,而不是完全拒绝粘贴操作 .

    - (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;
        }
    }
    
  • 1

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

    #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;
            }
        }
    
  • 1

    在Swift中设置最大长度有 generic solution . 通过IBInspectable,您可以在Xcode Attribute Inspector中添加新属性 .
    enter image description here

    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
        }
    
    }
    
  • 7

    Swift 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
    }
    
    }
    

    现在保存 class ......

    Usage..

    现在转到你的viewController.swift类,并将你的textfield的出口作为..

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

    现在转到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
        }
    
    }
    

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

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

    Features...

    • 它将设置特定文本字段的最大限制 .

    • 它将设置特定文本字段的已接受键的类型 .

    Types...

    containsOnlyCharactersIn //仅接受字符 .

    containsCharactersIn //接受字符组合

    doesNotContainsCharactersIn //不接受字符

    希望这有帮助....谢谢..

  • 6

    swift 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
        }
    

    谢谢你的投票 . :)

  • 1

    这是在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;
        }
    }
    
  • 11

    对于Xamarin:

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

    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
    }
    
  • 3

    其他答案不处理用户可以从剪贴板粘贴长字符串的情况 . 如果我粘贴一个长字符串,它应该被截断但显示 . 在你的代表中使用它:

    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",然后在.h中添加 <UITextViewDelegate> 以及.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));
    }
    
  • 2

    我开源了一个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;
      }
    
  • 12

    在此处使用此代码RESTRICTED_LENGTH是您要为textfield限制的长度 .

    - (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 != "")
    }
    

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

  • 5

    我已经实现了一个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
    
  • 7

    我基于@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
        }
    
    }
    
  • 987

    使用以下扩展名为 UITextFieldUITextView 字符限制 .

    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
            }
        }
    
        extension UITextView:UITextViewDelegate {
    
    
        @IBInspectable var maxLength: Int {
            get {
                if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                    return length
                } else {
                    return Int.max
                }
            }
            set {
                self.delegate = self
    
                objc_setAssociatedObject(self, &kAssociationKeyMaxLength, 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
        }
    }
    

    您可以在下面设置限制 .

    enter image description here

  • 21

    上面给出的一些答案的问题是,例如我有一个文本字段,我必须设置15个字符输入的限制,然后在输入第15个字符后停止 . 但他们不允许删除 . 那是删除按钮也不起作用 . 因为我面临同样的问题 . 推出解决方案,给定下面 . 适合我的作品

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
     if(textField.tag==6)
     {
        if ([textField.text length]<=30)
        {
            return YES;   
        }
        else if([@"" isEqualToString:string])
        {
            textField.text=[textField.text substringToIndex:30 ];
        }
    
        return NO;
     }
     else
     {
        return YES;
     }
    }
    

    我有一个文本字段,其标签我设置为“6”,我限制了最大字符数限制= 30;在每种情况下都能正常工作

相关问题