Почему textFieldDidEndEditing: не вызывается? - PullRequest
12 голосов
/ 04 августа 2009

У меня есть UITextField, и когда в него вводится текст, я хочу получить doubleValue из текстового поля, выполнить некоторые вычисления и отобразить их в UITableView.

Делегат для UITextField принимает протокол UITextFieldDelegate и реализует методы textFieldShouldReturn: и textFieldDidEndEditing:. textFieldShouldReturn: возвращает статус первого респондента, который, согласно документам, также должен вызывать textFieldDidEndEditing :, но я никогда не вижу textFieldDidEndEditing: selected.

- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
    if (theTextField == thresholdValue) {
        [thresholdValue resignFirstResponder];
    }
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self updateThresholdValue:textField];
}

Возможно, стоит отметить, что я также пытался подключить некоторые из событий текстового поля к делегату и вызывать событие updateThresholdValue: напрямую, но это тоже не сработало.

Ответы [ 5 ]

7 голосов
/ 09 декабря 2010

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

// if we encounter a newline character return
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{   
    // enter closes the keyboard
    if ([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return NO;
    }
    return YES;
}

Теперь срабатывает textFieldShouldEndEditing, и текстовое поле подает в отставку первый респондент.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
6 голосов
/ 05 августа 2009

textFieldDidEndEditing вызывается, когда текстовое поле подает в отставку, его статус первого респондента, в то время как textFieldShouldReturn вызывается при нажатии кнопки возврата.

Это звучит , как будто ваше текстовое поле никогда не уходит в качестве firstResponder. Вы можете проверить это довольно легко, поместив некоторый отладочный вывод (как предложено в комментариях) и просто переместившись за пределы текстового поля касанием - например, начните вводить текст, затем просто коснитесь за пределами поля, чтобы вынудить его подать в первую очередь.

Не уверен, что это очень помогает, но звучит как странный случай, когда вы бьете.

1 голос
/ 30 марта 2016

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

Очень "эффективно" из-за "юзабилити" андроида textFieldDidEndEditing (сарказм).

1 голос
/ 06 августа 2009

Как упоминалось в одном из комментариев, я попытался воспроизвести более простую версию того, что я пытался сделать, используя приложение HelloWorld, и оно работало с первой попытки, без проблем, как и ожидалось. Столкнувшись с этим, я немного удивился.

Где-то во всем поиске, который я сделал, чтобы попытаться получить ответ на эту проблему, я наткнулся на ссылку, где у человека возникла проблема с событиями, которые не запускались с кнопки, и оказалось, что проблема связана представление, в котором была размещена кнопка, и это представление, имеющее другое подпредставление в качестве пира к кнопке, и это подпредставление каким-то образом поглощало события, а не позволяло им идти туда, куда они были направлены. Сценарий не был точно таким же, как у меня, но звучал достаточно близко, чтобы расследование стоило того. Несмотря на все полученные здесь прекрасные советы, ни один из них еще не принес плодов.

Прошлой ночью я решил полностью заново создать файл пера с нуля (сделал копию того, что у меня был первый), и я заставил его работать. Ключевое отличие заключается в том, что в исходном нерабочем файле пера я перетащил из палитры TableViewController, а затем изменил его тип на мой подкласс PZTableViewController. Когда я сделал то же самое в моем новом наконечнике, события не произошли. Если, с другой стороны, я убрал перетаскиваемый TableViewController и вместо этого просто перетащил за NSObject, изменил его класс на PZTableViewController и подключил все, все «просто сработало».

Я постараюсь найти ссылку, с которой я начал, и опубликовать ее в виде редактирования или комментария.

Это также не полный ответ, потому что я еще не понимаю разницы между «палитрой» из 1014 * и моим подклассом. Когда я это выясню, я обновлю этот ответ с помощью редактирования или комментария.

0 голосов
/ 08 января 2019

Если вы применили UITextFieldDelegate протокол в вашем контроллере представления, то напишите следующую строку кода в методе viewDidLoad , чтобы активировать методы вышеуказанного протокола в соответствующие текстовые поля:

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}
...