Установите максимальную длину символа UITextField - PullRequest
459 голосов
/ 11 января 2009

Как установить максимальное количество символов в UITextField на iPhone SDK при загрузке UIView?

Ответы [ 43 ]

2 голосов
/ 01 марта 2016

Для Ксамарина:

YourTextField.ShouldChangeCharacters = 
delegate(UITextField textField, NSRange range, string replacementString)
        {
            return (range.Location + replacementString.Length) <= 4; // MaxLength == 4
        };
2 голосов
/ 23 сентября 2013

Это правильный способ обработки максимальной длины в 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;
    }
}
1 голос
/ 17 июня 2015

У меня есть открытый подкласс UITextField, STATextField , который предлагает эту функциональность (и многое другое) со своим свойством maxCharacterLength.

1 голос
/ 04 апреля 2013

Другие ответы не относятся к случаю, когда пользователь может вставить длинную строку из буфера обмена. Если я вставлю длинную строку, она должна быть обрезана, но показана. Используйте это в вашем делегате:

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 голос
/ 13 декабря 2013

Получил до 1 строки кода:)

Установите для делегата вашего текстового представления значение "self", затем добавьте <UITextViewDelegate> в свой .h и следующий код в свой .m .... вы можете настроить число "7" так, как вам нужно, чтобы ваш MAXIMUM номер персонажей быть.

-(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 голос
/ 30 сентября 2015

Используйте этот код здесь 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 голос
/ 26 ноября 2013

теперь сколько символов вы хотите просто дать значения

 - (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 голос
/ 20 марта 2019

Swift 4.2 и метод UITextFieldDelegate

Это работает для меня и ограничивает текстовое поле максимальным вводом 8 символов. Надеюсь, что в конечном итоге NSRange будет изменен на Range, но сейчас я рад использовать NSString, так как создание Range из NSRange предполагает работу с другим необязательным.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let text = textField.text ?? ""
    let nsString = text as NSString
    let newText = nsString.replacingCharacters(in: range, with: string)
    return newText.count <= 8
}
1 голос
/ 05 сентября 2018

Как насчет этого простого подхода. Это нормально работает для меня.

extension UITextField {

    func  charactersLimit(to:Int) {

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

Тогда:

someTextField.charactersLimit(to:16)
1 голос
/ 28 ноября 2014

Я добавил расширение UITextField, чтобы добавить к нему свойство maxLength.

Он основан на IBInspectables Xcode 6, поэтому вы можете установить ограничение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...