Проблема:Сохранение ссылки на 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
Спасибо за помощь!
Каждая ячейка, дебетованная, отличается и имеет другой идентификатор. Я уверен, что могу это исправить, хотя и очень нехорошо, но я также хотел бы понять, почему это не работает так, как есть. – nothingness
Это потому, что ячейки многократного использования используются как резиновые штампы для рисования ячеек, а не для обработки бизнес-логики позади клеток. Я не знаю точно, но я предполагаю, что когда вы устанавливаете регулярное выражение в одном вызове 'dequeue', он получает clobbered, или текст, подлежащий проверке, получает clobbered, на следующем вызове' dequeue'. – NRitH
Я думаю, что теперь вижу, так что, когда вы вызываете этот метод, он воссоздает ячейку по указанному индексу, а не извлекает фактическую ячейку, которая отображается - или я неправильно понимаю? Есть ли способ получить фактическую ячейку? – nothingness