Не допускайте номера A-Z и 0-9 в текстовом поле

Monika Patel спросил: 28 апреля 2018 в 09:39 в: ios

Я хочу реализовать некоторую проверку в моем проекте, проверка заключается в том, что: не разрешать число 0-9 и A-Z в UITextField, только разрешить письмо GUJARATI в UITextField. Я пробовал некоторые проверки, но он не работал. Мне нужна помощь от кого-либо.

Я пробовал этот ниже код:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //limit the size :
    if([self checkValidation:textField] == true)
    {
        return NO;
    }
    return YES;
}
- (BOOL)checkValidation:(UITextField *)textField
{
    NSString *rejex = [NSString stringWithFormat:@"%@",@"[A-Za-z0-9]"];
    NSPredicate *gujTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", rejex];    //if rejex fullfil than it will return true else false.
    return [gujTest evaluateWithObject:textField.text];
}

TIA

3 ответа

mag_zbc ответил: 28 апреля 2018 в 09:59

В вашей функции checkValidation вы берете textField в качестве аргумента и извлекаете его свойство text, но вы вызываете его в shouldChangeCharactersInRange, и к этому моменту свойство text по-прежнему сохраняет старое значение текста перед обновлением (оно обновляется после возврата true из этой функции). Вместо этого

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //limit the size :
    if([self checkValidation:string] == true)
    {
        return NO;
    }
    return YES;
}- (BOOL)checkValidation:(NSString *)string
{
    let stringWithGujaratiCharacters = "અ" // string with all Gujarati letters
    let characterSet = CharacterSet(charactersIn: stringWithGujaratiCharacters).inverted // character set containing every character besides Gujarati letters
    return string.rangeOfCharacter(from: characterSet) != nil // returns true if string contains characters other than Gujarati letters
}

Если вы просто не хотите разрешать латинские буквенно-цифровые символы, измените characterSet

let characterSet = CharacterSet.alphanumerics
Lenin ответил: 28 апреля 2018 в 10:03

Измените текстовое поле на строку ниже. он будет работать.

if([self checkValidation:string] == true)

и

- (BOOL)checkValidation:(NSString *)textField
{
    NSString *rejex = [NSString stringWithFormat:@"%@",@"[A-Za-z0-9]"];
    NSPredicate *gujTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", rejex];     //if rejex fullfil than it will return true else false.
    return [gujTest evaluateWithObject:textField];
}
Sulthan ответил: 29 апреля 2018 в 09:38

Для этой проблемы было бы лучше использовать обнаружение CharacterSet. Регулярное выражение не очень хорошо работает с unicode. Кроме того, лучше проверить символы, которые вы хотите разрешить, чем наоборот:

let text = textField.text ?? ""
// https://unicode.org/charts/PDF/U0A80.pdf 0x0A80 ... 0x0AFF
let gurajatiCharacterSet = CharacterSet(charactersIn: Unicode.Scalar(0x0A80 as Int)! ...  Unicode.Scalar(0x0AFF as Int)!)
return text.rangeOfCharacter(from: gurajatiCharacterSet.inverted) == nil

Objective-C:

NSUInteger minValue = 0x0A80;
NSUInteger maxValue = 0x0AFF;
NSCharacterSet *gurajatiCharacterSet = [NSCharacterSet characterSetWithRange:NSMakeRange(minValue, maxValue - minValue + 1)];return [textField.text rangeOfCharacterFromSet:[gurajatiCharacterSet invertedSet]].location == NSNotFound;
Satish ответил: 28 апреля 2018 в 12:40
Юникод Гуджарати: 0A80-0AFF
Sulthan ответил: 28 апреля 2018 в 12:42
@Satish Вы правы, обновлены
Monika Patel ответил: 29 апреля 2018 в 09:34
@Satish Я хочу сделать это в OBJECTIVE-C
Sulthan ответил: 29 апреля 2018 в 09:34
@MonikaPatel Ух, пропустил это :)
Sulthan ответил: 29 апреля 2018 в 09:40
@MonikaPatel Добавлена ​​версия Obj-c