Подтвердить что ты не робот

Backspace не работает при реализации shouldChangeCharactersInRange метод - iPhone Dev

Проблема... У меня есть строка допустимых символов "0123456789." Как я также разрешаю backspace с клавиатуры... когда я реализую код снизу... ключ backspace больше не работает... Как я могу это исправить?

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];

    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);

}
4b9b3361

Ответ 1

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];

    if (range.length == 1){
        return YES;
    }else{
        return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }


}

Ответ 2

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if ([string length] == 0) 
        return YES; 

    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    string = [[string componentsSeparatedByCharactersInSet:nonNumberSet] componentsJoinedByString:@""]; 
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    return NO; 
}

Это должно работать правильно с удалением/вырезанием нескольких символов одновременно, а также при вставке. Исправления приветствуются. Единственная известная проблема заключается в том, что при редактировании в середине текстового поля курсор отправляется в конец (потому что он возвращает NO) - я думаю, вы должны используйте UITextView, чтобы исправить это.

Ответ 3

NSCharacterSet *theNonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];


        if (range.length == 1){
            return YES;
        }else if(textField.text.length < ZipcodeTextLength)
        {
            return ([string stringByTrimmingCharactersInSet:theNonNumberSet].length > 0);
        }
        else
            return NO;

Это позволит Numbers и Backspace, а также вы можете ограничить длину текста.

Ответ 4

Это одна из моих реализаций. Возможно, это работает для вас.

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

for(UIView *view in _chooseUsernameDialog.subviews) {
    if([view isKindOfClass:[UIButton class]]) {
        int realLength;

        const char * _char = [string cStringUsingEncoding:NSUTF8StringEncoding];
        int isBackSpace = strcmp(_char, "\b");

        if (isBackSpace == -8) {
            // is backspace
            realLength = [textField.text length] - 1 ;
        }
        else
        {
            realLength = [textField.text length] + 1;
        }

        NSLog(@"%d", realLength );

        if(realLength < 4)
        {
            //too short

        }
        else{

            //long enough
        }
    }
}

return !([[textField text] length] + (string.length - range.length) > 13);
}