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.
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.
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField {
if (textField.tag == 1) { //first textField tag
//textField 1
}
else {
//textField 2
}
}
Use UITextFieldDelegate
and
func textFieldDidBeginEditing(textField: UITextField) {
println("did")
if textField.tag == 1{
self.txtFullName.layer.borderColor = UIColor.blueColor().CGColor
}
}
In swift 4:
- Implement
UITextFieldDelegate
into your ViewController
class
- Add the Outlets for the
textFields
you want to detect focus on
- Implement function
textFieldDidBeginEditing
(in case you want to be notified on that specific action, see Apple's documentation) and fill it with your code
- 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
}
...
}