2009-08-04 20 views
11

私は最初のiPhoneアプリを書いて遊んでいます。 SDK 3.0。私はUITextFieldを持っています。テキストが入力されると、テキストフィールドからdoubleValueを取得し、計算を実行してUITableViewに表示したいと考えています。なぜtextFieldDidEndEditing:呼び出されていないのですか?

UITextFieldのデリゲートは、UITextFieldDelegateプロトコルを採用し、textFieldShouldReturn:とtextFieldDidEndEditing:メソッドの両方を実装します。 textFieldShouldReturn:docsによるtextFieldDidEndEditing:も起動する必要がありますが、textFieldDidEndEditing:が呼び出されることはありません。

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

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

それは私もデリゲートにテキストフィールドのイベントの一部を接続し、イベントコールupdateThresholdValueを持つしようとしたことは注目に値することがあります直接、それはどちらか動作しませんでした。

+0

メソッドが実際に呼び出されないことを確認するために、いくつかのNSLogを配置します。 – mk12

+0

あなたはmyTextField.delegate = selfをどこか正しいと思いましたか? – mk12

+2

私は彼が彼の代理人が正しく接続されていると仮定します。そうでなければ、textFieldShouldReturn:も呼び出されません。 –

答えて

1

コメントの1つで述べたように、私はHelloWorldアプリケーションを使って簡単にしようとしていたバージョンを複製しようとしましたが、最初の試行で問題なく動作しました。それに直面して、私は少し不思議に思った。

私はこの問題に対する答えを得ようとしましたが、ボタンから発射されないイベントに問題があったというリンクを見つけました。問題が関連していることが判明しましたボタンが配置されたビューと別のサブビューをボタンのピアとして持つビューに表示され、そのサブビューは何らかの形でイベントを食べていました。このシナリオは私のものとまったく同じではありませんでしたが、調査は価値があります。ここで受けた優れたアドバイスのすべてにもかかわらず、誰もまだ果実を育てていませんでした。

昨夜私は最初からnibファイルを完全に再作成することに決めました(私が最初に持っていたコピーを作りました)。主な違いは、元の非作業用ファイルの私がパレットからTableViewControllerをドラッグして、サブタイプPZTableViewControllerに変更したことです。私が新しいペン先で同じことをしたとき、その出来事は起きなかった。一方、ドラッグしたTableViewControllerを取り除き、代わりにNSObjectをドラッグし、そのクラスをPZTableViewControllerに変更してすべてをplumbすると、すべてが「うまく働いた」。

私はこの考え方から始まったリンクを追いかけて、編集やコメントとして投稿します。

パレットからTableViewControllerと私のサブクラスの違いをまだ理解していないので、これも完全な答えではありません。私がそれを理解するとき、私は編集やコメントを通じてこの答えを更新します。

5

textFieldDidEndEditingは、戻り値ボタンが押されたときにtextFieldShouldReturnが発生したときに、テキストフィールドが最初のレスポンダステータスを終了すると発生します。

のように、あなたのテキストフィールドがfirstResponderとして辞任することはありません。いくつかのデバッグ出力を(コメントに示唆されているように)入れて、触れるだけでテキストフィールドからナビゲートすることができます。たとえば、入力を開始し、フィールドの外をタッチしてfirstResponderを辞任させます。

多くの場合、役立つかどうかはわかりませんが、奇妙なケースのように聞こえます。

+0

ありがとうございます。最初の質問に追加したコードを見てください。 testFieldShouldReturn:resignFirstResponderを呼び出します。私は、コードの辞任行がデバッガを介して実行されることを確認しました。 textFieldDidEndEditingはresignFirstResponderの実行の一部として呼び出されますか、または* resignFirstResponderが実行を完了した後に発生しますか? 最後に、実際のデバイスではなくシミュレータで実行しています。私はまだ魔法の鍵を持っていません。 –

+0

これに関する詳しい情報... HelloWorldデモアプリケーションを作成しました。テキストフィールド、ボタン、ラベルがあります:フィールドにテキストを入力し、ヒットボタンを押し、ラベルの更新を行います。ラベルが "Edit Did End"イベントをボタンと同じオブジェクトとアクションに送信するようにペン先を変更しました。そしてそれは働いた。だから、私は上記の私のアプリに戻り、同じことをした...それは動作しませんでした。微妙に異なるものがなければならないが、これまで私はそれを見つけていない。 –

+0

私がチェックするもう一つの事は、textFieldDidEndEditing *のメソッドシグネチャがapiドキュメントのシグネチャと一致していることです。私には似ていますが、デリゲートメソッドが呼び出されることがないというエラーがある場合にはそうです。実際には、署名を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

は、同じVC上に2つのUITextFieldがある場合を考慮します。入力時にkbdを辞任するのは良い考えですか? –

1

私はむしろ、残りのコールバックで全てのコーナーケースをカバーする方法を考え出すよりもテキストフィールドにすべての単一の変更を記録するためにeditingChanged配線をアップしてしまいました。

textFieldDidEndEditing(sarcasm)のアンドロイドのような「使いやすさ」のため、非常に「効率的」です。

関連する問題