2009-08-04 6 views
11

Я играю с написанием своего первого приложения для iphone; SDK 3.0. У меня есть UITextField, и когда текст вводится в это, я хочу получить doubleValue из текстового поля и выполнить некоторые вычисления и отобразить их в UITableView.Почему textFieldDidEndEditing: не называется?

Делегат для 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]; 
} 

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

+0

Поместите некоторые NSLogs, чтобы убедиться, что метод никогда не называется. – mk12

+0

Вы сделали myTextField.delegate = self где-то справа? – mk12

+2

Я предполагаю, что он имеет свой делегат, подключенный правильно, иначе textFieldShouldReturn: тоже не будет вызван. –

ответ

1

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

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

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

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

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

5

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

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

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

+0

Спасибо за примечание. Взгляните на код, который я добавил к первому вопросу. testFieldShouldReturn: вызывает вызов resignFirstResponder, и я подтвердил, что строка отставки кода выполняется через отладчик. Does textFieldDidEndEditing: получить вызов как часть выполнения resignFirstResponder, или это происходит * после того, как * resignFirstResponder завершил выполнение? Наконец, в случае, если это имеет значение, я все еще работаю на симуляторе, а не на самом устройстве. У меня еще нет волшебных клавиш. –

+0

Подробнее об этом ... Я вытолкнул демонстрационное приложение HelloWorld - имеет текстовое поле, кнопку и метку: введите текст в поле, нажмите кнопку, обновите метки. Я модифицировал наконечник так, чтобы метка отправила событие «Редактирование закончила» на тот же объект и действие, которое использует кнопка. И это сработало. Итак, я вернулся в свое приложение, описанное выше, и сделал то же самое ... и это не сработало. Должно быть, что-то по-разному, но до сих пор я этого не заметил. –

+0

Еще одна вещь, которую я проверил бы, заключается в том, что сигнатура метода для textFieldDidEndEditing * точно * соответствует сигнатуре из api docs, она выглядит правильно для меня, но если есть какая-либо ошибка в том, что метод делегата никогда не будет вызван. Фактически вы можете скопировать подпись непосредственно из документов API. – paulthenerd

6

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

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

теперь рассмотрим случай, когда у вас есть два UITextFields на одном и том же VC. Это хорошая идея отменить kbd при входе? –

1

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

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

Смежные вопросы