Detect Focus Change for UITextField

2020-05-19 02:15发布

I'm trying to set the animation for the view to move up when keyboard is hiding and appearing for the text fields and I got it to work perfectly fine, but when the focus moves from one text field to another, it doesn't work since the keyboard was already shown.

In viewDidLoad, I registered the following:

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

and then in the keyboardWillShow and keyboardWillHide methods, it determines if the view should move or not and animate accordingly. But if a keyboard was already shown and the user clicks on another text field that needs the view to move up, the method wouldn't get called. Is there any way to detect if a focus has been changed to another text field when the keyboard was already shown? It would be great if there is a way to do this without having to set all the text fields to delegates.

Thanks in advance.

4条回答
Fickle 薄情
2楼-- · 2020-05-19 02:54

Use the UITextField delegate methods .. its better on your case than the keyboard methods .. when textField got focus the - (void)textFieldDidBeginEditing:(UITextField *)textField; will be fired .. and when it lost focus - (void)textFieldDidEndEditing:(UITextField *)textField; will be fired.

查看更多
【Aperson】
3楼-- · 2020-05-19 02:54

In swift 4:

  1. Implement UITextFieldDelegate into your ViewController class
  2. Add the Outlets for the textFields you want to detect focus on
  3. Implement function textFieldDidBeginEditing (in case you want to be notified on that specific action, see Apple's documentation) and fill it with your code
  4. On viewDidLoad() assign your ViewController class as the delegate for the textField you previously added in step 2

It must look similar to:

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

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

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

    ...

}
查看更多
孤傲高冷的网名
4楼-- · 2020-05-19 02:55
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField {
if (textField.tag == 1) { //first textField tag
    //textField 1
}
else {
   //textField 2
}
}
查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-05-19 03:10

Use UITextFieldDelegate

and

func textFieldDidBeginEditing(textField: UITextField) {
        println("did")
        if textField.tag == 1{
            self.txtFullName.layer.borderColor = UIColor.blueColor().CGColor
        }
    }
查看更多
登录 后发表回答