textFieldShouldEndEditing вызывается несколько раз - PullRequest
5 голосов
/ 26 июня 2010

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

Если пользователь нажимает кнопку «Готово» после редактирования элемента исохранение / проверка завершается неудачно, затем отображается UIAlertView и пользователь остается на UITextField, который не проходит проверку.

Моя проблема заключается в следующем - когда пользователь нажимает на UITextField,ошибка сохранения / проверки на другой из UITextField s, затем метод (BOOL)textFieldShouldEndEditing:(UITextField *)textField вызывается несколько раз, и UIAlertView появляется несколько раз.нажимает «Готово» на клавиатуре, но вызывается несколько раз, когда пользователь нажимает на другую 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;
}

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

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

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

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

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

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

1 голос
/ 29 июля 2015

Другой вариант - позволить UIAlertView подделать правильную проверку и перенести корректирующую часть на более поздний срок. Как то так:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    double delayInSeconds = 0.;
    self.currentTextField.text = @"Something that won't trigger validation error";
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        // do what you need here
    });
}
0 голосов
/ 08 сентября 2016

Не могли бы вы добавить разные теги в каждое текстовое представление и проверить тег в textFieldShouldEndEditing? Или я упустил суть?

0 голосов
/ 14 июля 2010

Похоже, меня вызвали 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» в интерфейс, которая является истинной по умолчанию. И после «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;}

Удачи ...

...