UITextField フォーカス喪失イベント
-
16-09-2019 - |
質問
MyCustomUIView クラスに UITextField があり、UITextField がフォーカスを失ったときに、フィールドを非表示にして、代わりに別のものを表示したいと考えています。
の代表者 UITextField
に設定されています MyCustomUIView
IB経由で、「Did End On Exit」イベントと「Editing Did End」イベントもあり、 IBAction
内のメソッド MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
ただし、UITextField がフォーカスを失った場合、これらのイベントはどちらも発生しないようです。このイベントをどのようにトラップ/検索しますか?
の代表者 UITextField
として設定されています MyCustomUIView
だから私は受け取っている textFieldShouldReturn
完了したらキーボードを閉じるメッセージ。
しかし、私が興味があるのは、ユーザーが画面上の他の領域 (別のコントロールや単なる空白領域など) を押したときにテキスト フィールドがフォーカスを失ったときを把握することです。
解決
次のようにビューを UITextField デリゲートとして指定する必要があると思います。
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
追加のボーナスとして、プロパティの設定方法に応じて、「完了」ボタンまたは戻るボタンを押したときにキーボードを閉じる方法を次に示します。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
//This line dismisses the keyboard.
[theTextField resignFirstResponder];
//Your view manipulation here if you moved the view up due to the keyboard etc.
return YES;
}
他のヒント
次のメソッドにデリゲートを使用してみてください。
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
それは私にとってはうまくいきました。
の問題点は、 辞任ファーストレスポンダー 唯一の解決策は、明示的な手段によってのみトリガーできることです。 キーボード または UIテキストフィールド イベント。また、テキストフィールドの外側のどこかがタップされた場合にキーボードを非表示にする「フォーカス喪失イベント」も探していました。私が見つけた唯一の近似的で実用的な「解決策」は、ユーザーが編集を完了する(キーボードで完了/Returnを押す)まで他のビューのインタラクションを無効にし、それでもテキストフィールド間をジャンプして修正を行うことができるようにすることです。毎回キーボードをスライドさせて出し入れする必要がなくなります。
次のスニペットは、同じことをしたい人にとって役立つかもしれません。
// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {
for(UIView *v in [(UIView*)sender superview].subviews)
if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}
// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {
[(UIResponder*)sender resignFirstResponder]; // hide keyboard
for(UIView *v in [(UIView*)sender superview].subviews)
v.userInteractionEnabled = YES;
}
サブクラス化する必要があるかもしれません UITextField
そしてオーバーライド resignFirstResponder
. resignFirstResponder
テキストフィールドがフォーカスを失ったときに呼び出されます。
実装したと思います UIKeyboardDidHideNotification
そしてこのイベントではあなたは
次のようなコードを使用します
[theTextField resignFirstResponder];
このコードを削除してください。
同じコードを書き込むこともできます textFieldShouldReturn
方法。これも焦点を失いました。
Swift でこれに苦労している人向け。ViewController のビューにジェスチャ認識エンジンを追加して、ビューがタップされたときにテキストフィールドを閉じるようにします。ビューに対する後続のクリックをキャンセルしないことが重要です。
スイフト2.3
override func viewDidLoad() {
//.....
let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
//this line is important
viewTapGestureRec.cancelsTouchesInView = false
self.view.addGestureRecognizer(viewTapGestureRec)
//.....
}
func handleViewTap(recognizer: UIGestureRecognizer) {
myTextField.resignFirstResponder()
}