текстовые поля должны изменять символы в диапазоне, только первый выполняется

92
11

Может ли кто-нибудь помочь мне с этим ниже кодом, используя текстовые поля, следует менять символы в диапазоне, только первый выполняется?

#define ACCEPTABLE_CHARACTERS1 @" 1234567890"

- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
// first one................//
if (textField == self.phoneField)
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS1] invertedSet];

NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

return [string isEqualToString:filtered];
}

// second one ........
if (textField == self.phoneField) {

if (((range.location == 3)) ||( range.location == 7)) {

_phoneField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];

return NO;
}
else if (range.length == 1 &&
(range.location == 4 || range.location == 8)) {
range.location--;
range.length = 2;
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];

return NO;
}

if (range.length+range.location > textField.text.length) {
return NO;
}

NSUInteger newLength = [textField.text length] + [string length] - range.length;

return newLength <=10;
}
}

спросил(а) 2021-01-19T11:32:24+03:00 9 месяцев назад
1
Решение
65

Поскольку вы возвращаете значение функции в первом if блок не будет выполнять второй блок if, оператор return немедленно завершает выполнение текущей функции и возвращает свой аргумент как значение вызова функции.

Чтобы сделать число, отформатированное для вашего текстового поля, сделайте так:


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

NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890"] invertedSet];

NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

if (![string isEqualToString:filtered]) {
return NO;
}
if (((range.location == 3)) ||( range.location == 7))
{

textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
return NO;
}
else if (range.length == 1 &&
(range.location == 4 || range.location == 8)) {
range.location--;
range.length = 2;
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];

return NO;
}

if (range.length+range.location > textField.text.length) {
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <=12;
}

ответил(а) 2021-01-19T11:32:24+03:00 9 месяцев назад
47

См. Вы используете два оператора if. но в конце первого оператора if вы используете return, поэтому элемент управления выйдет из этого цикла. Даже оба условия правильные. Простое объяснение.

- (void)viewDidLoad {
[super viewDidLoad];

if (1) {
NSLog(@"true");
return;
}
if (true) {
NSLog(@"true1");
return;
}
// Do any additional setup after loading the view, typically from a nib
}

Он будет печатать только true, а не true1, потому что элемент управления выйдет.

ответил(а) 2021-01-19T11:32:24+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема