Я работаю над представлением, которое имеет несколько UITextField
объекты. Мой контроллер представления служит UITextFieldDelegate
, и я реализовал (BOOL)textFieldShouldEndEditing:(UITextField *)textField
метод, чтобы сохранить и проверить отображаемую запись.
Если пользователь нажимает на кнопку "Done" после редактирования объекта и сохранить/проверить сбоев, то a UIAlertView
отображен и пользователь сохранен UITextField
это приводит проверку к сбою.
Моя проблема - это - когда пользователь нажимает от UITextField
это перестанет работать, сохраняют/проверка на другой из UITextField
s, затем (BOOL)textFieldShouldEndEditing:(UITextField *)textField
метод называют многократно, и UIAlertView
открывается многократно.
Почему (BOOL)textFieldShouldEndEditing:(UITextField *)textField
названный однажды, когда пользователь нажимает "Done" на клавиатуру, но названный многократно, когда пользователь нажимает на другого UITextField
?
Вот мой код:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"textFieldShouldEndEditing called by textField with text=%@", textField.text);
currentItem.nameOrNumber = nameOrNumber.text;
// Try to save the managed object.
NSError *error = nil;
if (![[currentItem managedObjectContext] save:&error]) {
UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Uh Oh!",@"")
message:[error localizedDescription]
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK",@"")
otherButtonTitles:nil];
[errorAlert show];
[errorAlert release];
shouldEnd = NO;
}
return shouldEnd;
}
Я думаю, ваша проблема связана с порядком вызова методов textField, когда вы редактируете текстовое поле и непосредственно касаетесь другого.
Если я не ошибаюсь, это должно быть примерно так (вы редактируете A и касаетесь B)
textFieldShouldBeginEditing
для поля BtextFieldShouldEndEditing
для поля AtextFieldDidEndEditing
для поля AtextFieldDidBeginEditing
для поля BТаким образом, когда вы находитесь в методе textFieldShouldEndEditing
, текстовое поле B уже стало первым ответившим. Поэтому, когда вы заставляете появиться UIAlertView, B теряет фокус и таким образом вызывает textFieldShouldEndEditing
тоже!
Это также было проблемой для меня, когда я хотел поднять представление, когда текстовое поле начинало редактирование. Решение, которое я нашел, заключалось в создании булевой переменной класса, указывающей, переключаюсь ли я в данный момент с одного textField на другое.
Я установил ее в TRUE
в textFieldShouldBeginEditing
и в FALSE
в textFieldDidBeginEditing
. Когда вы находитесь в textFieldShouldEndEditing
, если оно установлено в TRUE
, это означает, что пользователь непосредственно коснулся другого текстового поля. Тогда вам просто нужно найти правильный способ сделать так, чтобы ваши тесты выполнялись только один раз (возможно, shouldEndEditing должен возвращать false или что-то в этом роде).
Выглядит правильно, что меня вызывают 2 раза для каждого тестового поля. Почему? Просто подумайте... у меня тоже так было и голова болит
Вы НЕ можете сделать что-то вроде этого
- (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{
if(i_dont_know){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title"
message:@"Message"
delegate:self
cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
[alert release];
return false;
}
return true;}
Это что, шоу UIAlertView также пытается отменить редактирование текстового поля и вызывает эту функцию "textFieldShouldEndEditing:"...
Поэтому мой способ решить эту проблему заключался в добавлении переменной-члена под названием "shouldEndEditing" в описание интерфейса, которая по умолчанию имеет значение true por default. И после "textFieldShouldEndEditing:" может быть что-то вроде этого.
- (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{
if(shouldEndEditing == false)
{
shouldEndEditing = true;
return false;
}
if(i_dont_know){
shouldEndEditing = false;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title"
message:@"Message"
delegate:self
cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
[alert release];
return false;
}
return true;}
Удачи...