web-dev-qa-db-ja.com

UITextFieldがフォーカスを失うイベント

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メッセージを受信して​​います。

しかし、私が興味を持っているのは、ユーザーが画面上の他の領域(たとえば、別のコントロールまたは空白の領域)を押して、テキストフィールドがフォーカスを失ったときを把握することです。

22
Alexi Groove

次のように、ビューを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;
}
14
Tim Bowen

次の方法でデリゲートを使用してみてください。

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

それは私のために働いた。

28
user3681049

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;
}
4
tosan

UITextFieldをサブクラス化し、resignFirstResponderをオーバーライドする必要がある場合があります。 resignFirstResponderは、テキストフィールドがフォーカスを失ったときに呼び出されます。

2
Tom Dalling

UIKeyboardDidHideNotificationを実装したと思いますが、この場合は

次のようなコードを使用します

[theTextField resignFirstResponder];

このコードを削除します。

また、同じコードをtextFieldShouldReturnメソッドで記述します。これも焦点を失った。

1
jenish

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()
    }
0
lwdthe1