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

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

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

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

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

13
Chris Cleeland 4 Авг 2009 в 19:48

6 ответов

Лучший ответ

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

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

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

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

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

2
Chris Cleeland 6 Авг 2009 в 14:53

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

// 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;
}
9
Miha Hribar 9 Дек 2010 в 13:22

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

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

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

6
paulthenerd 4 Авг 2009 в 20:59

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

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}
3
karjaubayev 8 Янв 2019 в 10:07

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

Очень «эффективный» из-за «юзабилити» textFieldDidEndEditing, как у Android (сарказм).

1
Anton Tropashko 18 Янв 2017 в 14:01

В моем случае textFieldDidEndEditing:(UITextField *)textField не был вызван, потому что вместо него был реализован textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason. Почему-то на iOS 13.4 он не назывался.

Я исправил это, просто удалив reason ....

Вопрос, почему перестал работать обратный вызов reason, все еще открыт, но короткий работает корректно.

enter image description here

0
Rostyslav Druzhchenko 17 Июн 2020 в 11:16