Почему textFieldDidEndEditing: не вызывается?

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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

// 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;
}

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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