textFieldDidEndEditing:が呼び出されないのはなぜですか?
-
22-07-2019 - |
質問
UITextFieldがあり、その中にテキストが入力されると、テキストフィールドからdoubleValueを取得し、いくつかの計算を実行してUITableViewに表示したいです。
UITextFieldのデリゲートは、UITextFieldDelegateプロトコルを採用し、textFieldShouldReturn:メソッドとtextFieldDidEndEditing:メソッドの両方を実装します。 textFieldShouldReturn:最初のレスポンダーステータスを辞任します。ドキュメントによると、textFieldDidEndEditing:もトリガーされるはずですが、textFieldDidEndEditing:が呼び出されることはありません。
- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
if (theTextField == thresholdValue) {
[thresholdValue resignFirstResponder];
}
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
[self updateThresholdValue:textField];
}
テキストフィールドイベントの一部をデリゲートに接続し、updateThresholdValue:イベントを直接呼び出すことも試みましたが、どちらも機能しなかったことは注目に値するかもしれません。
解決 3
コメントの1つで述べたように、私はHelloWorldアプリを使ってやろうとしていたことのより簡単なバージョンを複製しようとしましたが、最初の試行で問題なく動作しました。それに直面して、私は少し疑問に思い始めました。
この問題への回答を得るために行ったすべてのグーグルのどこかで、ボタンからイベントが発生しないという問題が発生しているリンクを見つけましたが、その問題はボタンが配置されたビューと、そのビューがボタンのピアとして別のサブビューを持ち、そのサブビューがイベントを指示された場所に移動させるのではなく、何らかの形でイベントを食べていたビュー。シナリオは私のシナリオとまったく同じではありませんでしたが、調査に値するほど十分に近いと思われました。ここで寄せられた優れたアドバイスにもかかわらず、実を結んだ人はいませんでした。
昨夜、nibファイルを最初から完全に再作成することにしました(最初に持っていたもののコピーを作成しました)。主な違いは、元の非作業nibファイルで、パレットから TableViewController
をドラッグし、そのタイプをサブクラス PZTableViewController
に変更したことです。新しいペン先で同じことをしたとき、イベントは発生しませんでした。一方、ドラッグされた TableViewController
を削除し、代わりに NSObject
にドラッグし、そのクラスを PZTableViewController
に変更してplumbした場合すべてが機能し、すべて「機能しました」
私は、この考え方に着手したリンクを追いかけて、編集またはコメントとして投稿しようとします。
これも完全な答えではありません。なぜなら、from-the-palette TableViewController
と私のサブクラスの違いをまだ理解していないからです。わかったら、編集またはコメントを介してこの回答を更新します。
他のヒント
説明したのと同じ問題が発生しました。考えられるすべてを試した後、このデリゲートメソッドを追加しました。
// 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;
}
textFieldDidEndEditingは、テキストフィールドが最初のレスポンダーステータスを辞めるときに発生し、リターンボタンが押されるとtextFieldShouldReturnが発生します。
テキストフィールドがfirstResponderとして決して辞任しないように音します。いくつかのデバッグ出力(コメントで提案されているように)を入力し、タッチでテキストフィールドから移動するだけで簡単に確認できます。
それが大いに役立つかどうかはわかりませんが、ヒットしている奇妙なケースのように聞こえます。
私は最終的に編集を変更しましたすべてのコーナーケースを残りのコールバックでカバーする方法を考えるのではなく、テキストフィールドへのすべての変更を記録するように変更しました。
非常に「効率的」アンドロイドのような「使いやすさ」のためtextFieldDidEndEditing(sarcasm)の。
View Controllerで UITextFieldDelegate プロトコルを採用した場合、 viewDidLoad メソッドに次のコード行を記述して、対応するtextFieldsに対して上記のプロトコルのメソッドをアクティブにします:
override func viewDidLoad() {
//other stuff
yourTextField.delegate = self
}