1

UI テキスト フィールドで電話カード番号フォーム ユーザーを取得しています。数値の形式は次のようになります

123-4567-890

ユーザーが123を自動的に入力するUITextFieldと、4567の後に同じように挿入されます。

私はUITextFieldデリゲートメソッドで次のコードを使用してそれを行いました:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
       NSLog(@"***** %d",textField.text.length);


             if(textField.text.length == 3) 

             {
                 textField.text  = [textField.text  stringByAppendingString:@"-"];
             }  

       return YES;
}

しかし、テキストをクリアしている間に問題が発生し、クリアを開始すると.

最後の 3 桁の 890 がクリアされ、その後 - 追加され、クリアされ、再び追加され、すっごくクリアが停止します。

を使用して一度にすべてのテキストをクリアします

textField.clearButtonMode = UITextFieldViewModeWhileEditing; //To clear all text at a time

ただし、ユーザーは一度に 1 文字ずつ削除する必要があるという要件があります。

それを達成する方法は?

4

2 に答える 2

3

クリア中replacementStringは空にする必要があります@""。したがって、長さのチェックに加えて、置換文字列もチェックする必要があります。このような:

if (textField.text.length == 3 && ![string isEqualToString:@""]) {
    // append -
}
于 2012-10-19T07:03:20.310 に答える
1

USE: このフォーラムのどこかでこれを見たことがあります。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *filter = @"###-####-###";
    if(!filter) return YES;
    NSString *changedString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    if(range.length == 1 &&  string.length < range.length && [[textField.text substringWithRange:range] rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]].location == NSNotFound)
    {
        NSInteger location = changedString.length-1;
        if(location > 0)
        {
            for(; location > 0; location--)
            {
                if(isdigit([changedString characterAtIndex:location]))
                    break;
            }
            changedString = [changedString substringToIndex:location];
        }
    }
    textField.text = filteredStringFromStringWithFilter(changedString, filter);
    return NO;
}

NSString *filteredStringFromStringWithFilter(NSString *string, NSString *filter)
{
     NSUInteger onOriginal = 0, onFilter = 0, onOutput = 0;
     char outputString[([filter length])];
     BOOL done = NO;

     while(onFilter < [filter length] && !done)
     {
         char filterChar = [filter characterAtIndex:onFilter];
         char originalChar = onOriginal >= string.length ? '\0' : [string characterAtIndex:onOriginal];
         switch (filterChar) {
         case '#':
            if(originalChar=='\0')
            {
                done = YES;
                break;
            }
            if(isdigit(originalChar))
            {
                outputString[onOutput] = originalChar;
                onOriginal++;
                onFilter++;
                onOutput++;
            }
            else
            {
                onOriginal++;
            }
            break;
        default:
            outputString[onOutput] = filterChar;
            onOutput++;
            onFilter++;
            if(originalChar == filterChar)
                onOriginal++;
            break;
        }
    }
    outputString[onOutput] = '\0';
    return [NSString stringWithUTF8String:outputString];
}
于 2014-08-11T12:14:15.383 に答える