web-dev-qa-db-ja.com

UITextFieldの最大長を設定

UITextFieldに最大長を設定する方法はありますか?

HTML入力フィールドのMAXLENGTH属性のようなもの。

63
Elegya

これはバックスペースとコピー&ペーストで正しく動作します:

#define MAXLENGTH 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;
}

PDATE: MAXLENGTHであってもリターンキーを受け入れるように更新されました。ロジャースさん、ありがとう!

240
Tomas Andrle

[〜#〜] update [〜#〜]

この回答は受け入れられているため削除できませんが、正しくありませんでした。以下は、TomAからコピーした正しいコードです。

#define MAXLENGTH 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;
}

[〜#〜] original [〜#〜]

UITextFieldを意味すると思います。はいの場合、簡単な方法があります。

  1. ITextFieldDelegate プロトコルを実装する
  2. textField:shouldChangeCharactersInRange:replacementString: 方法。

このメソッドは、すべての文字タップまたは以前の文字置換で呼び出されます。この方法では、次のようなことができます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH) {
        textField.text = [textField.text substringToIndex:MAXLENGTH-1];
        return NO;
    }
    return YES;
}
40
coneybeare

バックスペースを正しく処理し、指定された長さ制限に文字を制限するより良い機能は次のとおりです。

#define MAXLENGTH 8

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        int length = [textField.text length] ;
        if (length >= MAXLENGTH && ![string isEqualToString:@""]) {
            textField.text = [textField.text substringToIndex:MAXLENGTH];
            return NO;
        }
        return YES;
    }

乾杯!

16
Varun Chatterji

このコードはテキストを制限すると同時に、文字を入力したり、テキストの任意の場所に貼り付けたりすることもできます。結果のテキストが長すぎる場合、範囲内の文字を変更し、結果のテキストを制限まで切り捨てます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] - range.length + [string length];
    if (newLength >= MAXLENGTH) {
        textField.text = [[textField.text stringByReplacingCharactersInRange:range withString:string] substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}
11
Andy Bradbrook

私はこのコードがトリックを行うと思います:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
                                                       replacementString:(NSString*)string
{
   if (range.location >= MAX_LENGTH)
      return NO;
    return YES;
}

このデリゲートメソッドを使用すると、ユーザーがMAX_LENGTHを超える文字をテキストフィールドに追加することを防ぐことができ、必要に応じてユーザーがバックスペースを入力できるようにする必要があります。

4
Roberto Miranda

これは私がその問題を解決した方法です。最大制限に達すると、それ以上追加しようとはしません...文字のみを削除できます

#define MAX_SIZE ((int) 5)
...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] >= MAX_SIZE && ![string isEqualToString:@""]) {
        return NO;
    }

    return YES;
}
2
pedrotorres

私にとってこれは魔法でした:

if (textField.text.length >= 10 && range.length == 0)
    return NO;
return YES;
2
vishwa.deepak

これは、cononybeareの答えに似ていますが、テキストフィールドに最大MAXLENGTHシンボルを含めることができるようになりました。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH - 1) {
        textField.text = [textField.text substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}
1
objcdev.ru

テキストが配置される場所と、追加されるテキストの長さ(複数の文字を貼り付ける場合)に注意する必要があります。最大長に関するこれらの間のパターンは、それらの合計が最大長を超えてはならないということです。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSInteger locationAndStringLengthSum = range.location + [string length];

    if ([textField isEqual:_expirationMonthField]) {
        if (locationAndStringLengthSum > EXP_MONTH_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_expirationYearField]) {
        if (locationAndStringLengthSum > EXP_YEAR_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_securityCodeField]) {
        if (locationAndStringLengthSum > SECURITY_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_zipCodeField]) {
        if (locationAndStringLengthSum > Zip_CODE_MAX_CHAR_LENGTH) {
            return NO;
        }
    }

    return YES;
}
1
David Robles

そのような特性はないと思います。

ただし、UILabelに割り当てるテキストはNSStringでなければなりません。そして、この文字列をUILabelのテキストプロパティに割り当てる前に、たとえば、NSStringの次のメソッドを使用して、指定されたインデックス(maxlength)で文字列をトリミングできます。

- (NSString *)substringToIndex:(NSUInteger)anIndex
1
schaechtele