web-dev-qa-db-ja.com

UITextFieldのフォーカス変更を検出

キーボードが非表示になってテキストフィールドに表示されているときにビューのアニメーションを上に移動しようとしていますキーボードがすでに表示されているためです。

ViewDidLoadで、次を登録しました。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

そしてkeyboardWillShowおよびkeyboardWillHideメソッドで、ビューを移動するかどうかを決定し、それに応じてアニメーション化します。ただし、キーボードが既に表示されていて、ユーザーがビューを上に移動する必要がある別のテキストフィールドをクリックした場合、メソッドは呼び出されません。キーボードが既に表示されているときに、フォーカスが別のテキストフィールドに変更されたかどうかを検出する方法はありますか?すべてのテキストフィールドをデリゲートに設定せずにこれを実行する方法があれば素晴らしいでしょう。

前もって感謝します。

34
Dennis

UITextFieldデリゲートメソッドを使用します。キーボードメソッドよりも、あなたの場合に適しています。textFieldがフォーカスを取得すると、- (void)textFieldDidBeginEditing:(UITextField *)textField;が起動され、フォーカスを失ったときに- (void)textFieldDidEndEditing:(UITextField *)textField;が起動します。解雇。

73
Malek_Jundi
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField {
if (textField.tag == 1) { //first textField tag
    //textField 1
}
else {
   //textField 2
}
}
9

UITextFieldDelegateを使用する

そして

func textFieldDidBeginEditing(textField: UITextField) {
        println("did")
        if textField.tag == 1{
            self.txtFullName.layer.borderColor = UIColor.blueColor().CGColor
        }
    }
5

In Swift 4:

  1. UITextFieldDelegateクラスにViewControllerを実装します
  2. フォーカスを検出するtextFieldsのアウトレットを追加します
  3. 関数textFieldDidBeginEditingを実装します(その特定のアクションについて通知を受けたい場合は、 Appleのドキュメント を参照してください)。それをコードで埋めます
  4. viewDidLoad()で、ステップ2で以前に追加したViewControllerのデリゲートとしてtextFieldクラスを割り当てます。

次のように見える必要があります。

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var yourTextField: UITextField!

    func textFieldDidBeginEditing(_ textField: UITextField) {
        // Your code here
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        yourTextField.delegate = self
    }

    ...

}
3
Raul Olmedo