textFieldShouldEndEditing называют многократно

Я работаю над представлением, которое имеет несколько UITextField объекты. Мой контроллер представления служит UITextFieldDelegate, и я реализовал (BOOL)textFieldShouldEndEditing:(UITextField *)textField метод, чтобы сохранить и проверить отображаемую запись.

Если пользователь нажимает на кнопку "Done" после редактирования объекта и сохранить/проверить сбоев, то a UIAlertView отображен и пользователь сохранен UITextField это приводит проверку к сбою.

Моя проблема - это - когда пользователь нажимает от UITextField это перестанет работать, сохраняют/проверка на другой из UITextFields, затем (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;
}
6
задан Piyush Dubey 1 March 2014 в 14:12
поделиться

2 ответа

Я думаю, ваша проблема связана с порядком вызова методов textField, когда вы редактируете текстовое поле и непосредственно касаетесь другого.

Если я не ошибаюсь, это должно быть примерно так (вы редактируете A и касаетесь B)

  • textFieldShouldBeginEditing для поля B
  • textFieldShouldEndEditing для поля A
  • textFieldDidEndEditing для поля A
  • textFieldDidBeginEditing для поля B

Таким образом, когда вы находитесь в методе textFieldShouldEndEditing, текстовое поле B уже стало первым ответившим. Поэтому, когда вы заставляете появиться UIAlertView, B теряет фокус и таким образом вызывает textFieldShouldEndEditing тоже!

Это также было проблемой для меня, когда я хотел поднять представление, когда текстовое поле начинало редактирование. Решение, которое я нашел, заключалось в создании булевой переменной класса, указывающей, переключаюсь ли я в данный момент с одного textField на другое. Я установил ее в TRUE в textFieldShouldBeginEditing и в FALSE в textFieldDidBeginEditing. Когда вы находитесь в textFieldShouldEndEditing, если оно установлено в TRUE, это означает, что пользователь непосредственно коснулся другого текстового поля. Тогда вам просто нужно найти правильный способ сделать так, чтобы ваши тесты выполнялись только один раз (возможно, shouldEndEditing должен возвращать false или что-то в этом роде).

4
ответ дан 17 December 2019 в 04:41
поделиться

Выглядит правильно, что меня вызывают 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;}

Удачи...

0
ответ дан 17 December 2019 в 04:41
поделиться