Не допускайте AZ и 0-9 числа в текстовом поле - PullRequest
0 голосов
/ 22 мая 2018

Я хочу реализовать некоторую проверку в моем проекте, проверка такова: не разрешать цифры 0-9 и AZ в 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

Ответы [ 4 ]

0 голосов
/ 27 июля 2018

Для этой проблемы вы можете использовать NSCharacterSet.

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

    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"];
    for (int i = 0; i < [string length]; i++)
    {
        unichar c = [string characterAtIndex:i];
        if (![myCharSet characterIsMember:c])
        {
            return NO;
        }
    }
    return YES;
}
0 голосов
/ 22 мая 2018

В вашей функции 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
0 голосов
/ 22 мая 2018

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

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];
}
0 голосов
/ 22 мая 2018

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...