1

Проблема:Сохранение ссылки на UITextField «текст» поле

Я пытаюсь создать пользовательский класс UITextField «UIValidatedTextField», который позволяет один установить определенные правила относительно того, вход правилен. Например, вы можете установить параметр regex, чтобы убедиться, что вход имеет определенный формат, то есть пароль, адрес электронной почты и т. Д.

Еще одна возможность этого - указать и установить параметр, который ссылается на другой UITextField и гарантирует, что вход соответствует входному сигналу от другого UITextField.

Проблема, которая возникает у меня здесь, заключается в том, что я устанавливаю эту ссылку на другой UITextField. Однако, когда я получаю доступ к своему «текстовому» полю, я обнаружил, что в текстовом поле ничего нет, даже когда я ввожу что-то в него.

Я усмотрел родственный код ниже:

#import "UIRegisterViewController.h" 
#import "UIRegisterViewCell.h" 
#import "UIValidatedTextField.h" 
#import "NSConstants.h" 

@interface UIRegisterViewController() 


@end 

@implementation UIRegisterViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _tableView.delegate = self; 
    _tableView.dataSource = self; 
    _tableItems = @[@"name", @"email", @"netId", @"username", @"password", @"confirmPassword"]; 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [_tableItems count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSString *cellIdentifier = [_tableItems objectAtIndex:indexPath.row]; 
    UIRegisterViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 


    if ([cellIdentifier isEqualToString:@"email"]) { 
     [cell.textField setRegex:VALID_DUKE_EMAIL_REGEX]; 

    } else if ([cellIdentifier isEqualToString:@"netId"]) { 
     //Validation? 

    } else if ([cellIdentifier isEqualToString:@"username"]) { 
     //Validation? 

    //THIS IS THE CELL THAT I WANT TO COMPARE INPUT TO 
    } else if ([cellIdentifier isEqualToString:@"password"]) { 
     [cell.textField setRegex:VALID_PASSWORD_REGEX]; 

    //SETTING THE TEXT FIELD IN QUESTION HERE... 
    } else if ([cellIdentifier isEqualToString:@"confirmPassword"]) { 
     [cell.textField setRegex:VALID_PASSWORD_REGEX]; 
     NSIndexPath *index = [NSIndexPath indexPathForRow:4 inSection:0]; 
     UIRegisterViewCell *confirm =(UIRegisterViewCell *)[self tableView:_tableView cellForRowAtIndexPath:index]; 
     [cell.textField setConfirm:confirm.textField]; 
    } 

    cell.textField.delegate = self; 
    return cell; 
} 

#pragma mark - Text Field Delegate 
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 


@end 

Обратите внимание, что TextFields являются UIValidatedTextFields - пользовательский класс приведен ниже:

#import "UIValidatedTextField.h" 
#import "NSArgumentValidator.h" 

@implementation UIValidatedTextField 

- (id) initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self initialize]; 
    } 
    return self; 
} 

- (id)initialize { 
    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) 
       name:UITextFieldTextDidChangeNotification object:self]; 
     [self validate]; //Validate in case editing began before observer was set. 
    } 
    return self; 
} 

- (void) setOptional:(BOOL)isOptional { 
    _isOptional = isOptional; 
} 

- (BOOL) isOptional { 
    return _isOptional; 
} 

- (void) setRegex:(NSString *)regex { 
    _regex = regex; 
} 

//SET THE TEXT FIELD TO COMPARE INPUT AGAINST HERE. 
- (void) setConfirm:(UITextField *)confirm { 
    _confirm = confirm; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) 
      name:UITextFieldTextDidChangeNotification object:_confirm]; 
    [self validate]; //Validate in case editing on confirm began before observer was set. 
} 

- (void) setQuery:(NSString *)query { 
    _query = query; 
} 

- (void) textFieldDidChange:(NSNotification *)notification { 
    NSLog(@"UPDATE"); 
    _isValid = [self validate]; 
    [self showInputValidation]; 
} 

- (BOOL) validateRegex { 
    if (_regex.length == 0) { 
     return true; 
    } 
    return [NSArgumentValidator isValid:self.text withRegex:_regex]; 
} 

- (BOOL) validateConfirm { 
    // NSLog(@"%@ : %@", [_confirm text], self.text); 
    if (_confirm == NULL) { 
     //NSLog(@"IS NULL"); 
     return true; 
    } 
    return [self.text isEqualToString:_confirm.text]; 
} 

- (BOOL) validateQuery { 
    return true; 
} 

- (BOOL) validate { 
    _isValid = (self.text == 0 && _isOptional) || ((self.text != 0) && [self validateRegex] && [self validateConfirm] && [self validateQuery]); 
    return _isValid; 
} 

//IF ANYONE HAS A SOLUTION AS TO HOW TO MAKE CHANGING BORDER COLOR CHANGE THE COLOR ALONG THE ROUNDED BORDER THAT IS PRESENT AS OPPOSED TO A RECTANGULAR BORDER LET ME KNOW. 
- (void) showInputValidation { 
    self.layer.borderWidth = 1.0; 
    if (self.text.length == 0) { 
     self.layer.borderColor = [[UIColor blackColor] CGColor]; 
    } else if (_isValid) { 
     self.layer.borderColor = [[UIColor greenColor] CGColor]; 
    } else { 
     self.layer.borderColor = [[UIColor redColor] CGColor]; 
    } 
} 
- (void) finalize { 
    [super finalize]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
      name:UITextFieldTextDidChangeNotification object:self]; 

    if (_confirm != NULL) { 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
       name:UITextFieldTextDidChangeNotification object:_confirm]; 
    } 
} 

@end 

Спасибо за помощь!

ответ

0

Один из ярких ошибок в этом коде заключается в том, что вы задаете регулярное выражение в cellForRowAtIndexPath:, хотя все ячейки повторно используют один и тот же объект ячейки. cellForRowAtIndexPath: следует использовать только для настройки содержимого ячейки, например текста и цвета. Вместо этого создайте IBOutlet для проверки текстовых полей и добавьте их регулярные выражения в viewDidLoad. Еще лучше отделите пользовательский подкласс целиком и вместо этого запустите проверку регулярных выражений, когда одно из соответствующих текстовых полей срабатывает при завершении редактирования.

+0

Каждая ячейка, дебетованная, отличается и имеет другой идентификатор. Я уверен, что могу это исправить, хотя и очень нехорошо, но я также хотел бы понять, почему это не работает так, как есть. – nothingness

+0

Это потому, что ячейки многократного использования используются как резиновые штампы для рисования ячеек, а не для обработки бизнес-логики позади клеток. Я не знаю точно, но я предполагаю, что когда вы устанавливаете регулярное выражение в одном вызове 'dequeue', он получает clobbered, или текст, подлежащий проверке, получает clobbered, на следующем вызове' dequeue'. – NRitH

+0

Я думаю, что теперь вижу, так что, когда вы вызываете этот метод, он воссоздает ячейку по указанному индексу, а не извлекает фактическую ячейку, которая отображается - или я неправильно понимаю? Есть ли способ получить фактическую ячейку? – nothingness

 Смежные вопросы

  • Нет связанных вопросов^_^