MyCustomUIViewクラスにUITextFieldがあり、UITextFieldがフォーカスを失ったときに、フィールドを非表示にして、別の場所に表示したいと思います。
UITextField
のデリゲートはIBを介してMyCustomUIView
に設定され、IBAction
内のMyCustomUIView
メソッドを指す「DidEndOnExit」および「EditingDidEnd」イベントもあります。
@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;
}
それは私のために働いた。
resignFirstResponderソリューションのみの問題は、明示的なkeyboardまたはITextFieldイベントによってのみトリガーできることです。また、テキストフィールドの外側のどこかがタップされた場合に、キーボードを非表示にする「フォーカス喪失イベント」を探していました。私が遭遇した唯一の密接で実用的な「解決策」は、ユーザーが編集を終了するまで(キーボードで完了/戻る)、他のビューのインタラクションを無効にすることですが、それでもテキストフィールド間をジャンプして修正することはできません毎回キーボードをスライドさせて挿入する必要があります。
次のスニペットは、同じことをしたい人に役立つかもしれません。
// 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のビューにジェスチャレコグナイザーを追加して、ビューがタップされたときにテキストフィールドを閉じるようにします。ビューの後続のクリックをキャンセルしないことが重要です。
Swift 2.
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()
}