25

MyCustomUIView クラスに UITextField があり、UITextField がフォーカスを失ったときに、フィールドを非表示にして別のものを表示したいと考えています。

のデリゲートはIB 経由UITextFieldで設定されており、内のメソッドをMyCustomUIView指す「Did End On Exit」および「Editing Did End」イベントもあります。IBActionMyCustomUIView

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

ただし、UITextField がフォーカスを失った場合、これらのイベントはどちらも発生しないようです。このイベントをどのようにトラップ/検索しますか?

のデリゲートUITextFieldが設定されているので、完了したらキーボードを閉じるようにというメッセージをMyCustomUIView受け取ります。textFieldShouldReturn

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

4

7 に答える 7

30

次のメソッドにデリゲートを使用してみてください。

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

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

于 2014-05-28T16:33:54.750 に答える
15

ビューを次のように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;
}
于 2009-07-15T20:38:12.640 に答える
4

resignFirstResponderソリューションのみの問題は、明示的なキーボードまたはUITextFieldイベントによってのみトリガーできることです。また、テキストフィールドの外側のどこかがタップされた場合に、キーボードを非表示にする「フォーカス喪失イベント」を探していました。私が遭遇した唯一の密接で実用的な「解決策」は、ユーザーが編集を終了するまで(キーボードで完了/戻る)、他のビューの対話を無効にすることですが、それでもテキストフィールド間をジャンプして修正することはできません毎回キーボードをスライドさせて挿入する必要があります。

次のスニペットは、同じことをしたい人に役立つかもしれません。

// 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;
}
于 2011-04-13T09:28:55.107 に答える
2

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

于 2009-07-16T03:07:20.830 に答える
1

私はあなたが実装したと思いますUIKeyboardDidHideNotification、そしてこのイベントではあなたは

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

[theTextField resignFirstResponder];

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

方法も同じコードを書きtextFieldShouldReturnます。これも焦点を失いました。

于 2015-12-24T12:42:42.077 に答える
0

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()
    }
于 2016-10-27T19:02:53.693 に答える