Ограничить длину нескольких UITextFields

#objective-c #cocoa-touch #ios #uitextfield #uitextfielddelegate

#цель-c #cocoa-touch #iOS #uitextfield #uitextfielddelegate

Вопрос:

У меня их четыре UITextField , и я хотел бы ограничить длину каждого из них, но все они разной длины. Пока у меня есть следующий код, но он работает не совсем корректно

 define MAXLENGTH 5
define MAXQTY 3
define MAXSIZE 4
define MAXBRAND 10

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    int lengtha = [brand.text length] ;
    NSLog(@"lenghta = %d",lengtha);
    if (lengtha >= MAXBRAND amp;amp; ![string isEqualToString:@""]) {
    brand.text = [brand.text substringToIndex:MAXBRAND];
        return NO;
    }
    return YES;

    int lengthb = [qty.text length] ;
    NSLog(@"lenghtb = %d",lengtha);
    if (lengthb >= MAXQTY amp;amp; ![string isEqualToString:@""]) {
        qty.text = [qty.text substringToIndex:MAXQTY];
        return NO;
    }
    return YES;

    int lengthc = [size.text length] ;
    NSLog(@"lenghtc = %d",lengtha);
    if (lengthc >= MAXSIZE amp;amp; ![string isEqualToString:@""]) {
        size.text = [size.text substringToIndex:MAXSIZE];
        return NO;
    }
    return YES;

    int lengthd = [price.text length] ;
    NSLog(@"lenghtd = %d",lengtha);
    if (lengthd >= MAXLENGTH amp;amp; ![string isEqualToString:@""]) {
        price.text = [price.text substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}
  

Комментарии:

1. Как только ваш код достигает первого «return YES;» после инструкции if, больше ничего не обрабатывается. Ваша логика неверна.

Ответ №1:

Если марка, количество, размер и цена являются переменными экземпляра (или свойствами) и подключены к вашим UITextFields, вы могли бы попробовать это:

 define MAXLENGTH 5
define MAXQTY 3
define MAXSIZE 4
define MAXBRAND 10

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    if (textField == brand) {
        int lengtha = [brand.text length];
        NSLog(@"lenghta = %d",lengtha);
        if (lengtha >= MAXBRAND amp;amp; ![string isEqualToString:@""]) {
            brand.text = [brand.text substringToIndex:MAXBRAND];
            return NO;
        }
        return YES;
    } else if (textField == qty) {
        int lengthb = [qty.text length];
        NSLog(@"lenghtb = %d",lengthb);
        if (lengthb >= MAXQTY amp;amp; ![string isEqualToString:@""]) {
            qty.text = [qty.text substringToIndex:MAXQTY];
            return NO;
        }
        return YES;
    } else if (textField == size) {
        int lengthc = [size.text length];
        NSLog(@"lenghtc = %d",lengthc);
        if (lengthc >= MAXSIZE amp;amp; ![string isEqualToString:@""]) {
            size.text = [size.text substringToIndex:MAXSIZE];
            return NO;
        }
        return YES;
    } else if (textField == price) {
        int lengthd = [price.text length];
        NSLog(@"lenghtd = %d",lengthd);
        if (lengthd >= MAXLENGTH amp;amp; ![string isEqualToString:@""]) {
            price.text = [price.text substringToIndex:MAXLENGTH];
            return NO;
        }
        return YES;
    }
    return YES;
}
  

Комментарии:

1. Я внес изменения в код в соответствии с вашим предложением, и я все еще получаю тот же результат, текстовое поле не ограничено, и NSLog не сообщает о количестве символов. У меня все UITextFields настроены в файле .h, а IBOutlets также в файле .h

2. Я исправил это, ваш код великолепен, я добавил brand.delegate=self в viewDidLoad, и теперь он отлично работает, спасибо за вашу помощь

3. Да, вы должны установить делегат для всех четырех UITextFields. Также я немного отредактировал свой приведенный выше код. Вы всегда вводили NSLogging lengtha во всех четырех случаях вместо того, чтобы каждый раз использовать правильную переменную (lengtha, lengthb, lengthc, lengthd).