This is my code:
while (true) {
if ([identificationField becomeFirstResponder]) {
NSLog(@"finally!");
break;
}
else{
if ([identificationField canBecomeFirstResponder]) {
NSLog(@"can");
}
else{
NSLog(@"cannot");
}
NSLog(@"%@", identificationField);
NSLog(@"dadgum!!");
}
}
This is what it logs:
2014-02-05 11:33:54.253 Store Test[22488:70b] can
2014-02-05 11:33:54.254 Store Test[22488:70b] <UITextField:
0xb5c89a0; frame = (10 1; 300 43); text = ''; clipsToBounds = YES;
opaque = NO; autoresize = TM+BM; gestureRecognizers = <NSArray:
0xb5cc7b0>; layer = <CALayer: 0xb5c8b40>>
2014-02-05 11:33:54.254 Store Test[22488:70b] dadgum!!
Does anyone know why it might do that? As you can see, the text field can become the first responder, it just won't.
Is your identificationField in UIView hierarchy? If it hasn't added into window and shown it cannot became first responder.
A UITextField
will also refuse to become first responder if its userInteractionEnabled
property is NO
as I just discovered. I had to explicitly re-enable user interaction on the text field before it would accept first responder status.
Also worth noting is you can force whatever element currently has first responder status to give it up by calling [UIView endEditing:YES]
on any superview that contains the current first responder.
You probably have another element that is stopping it. Need to know more about your project to really answer with the exact problem.
However, here's a possible you have another textField that has the delegate method
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return NO;
}
That would mean it doesn't resign first responder.
The call to canBecomeFirstResponder
only checks if the receiver can itself become the first responder.
The call to becomeFirstResponder
will fail and return NO
if either the receiver can't become first responder or if the current first responder can't resign.
Whatever is already the first responder can refuse to give up first responder status. In that case, your UITextField
won't become the first responder. So you should make sure that whatever is already the first responder isn't refusing to give up that status.
EDIT:
You won't want to leave this in an app when submitted to the app store, but here's some code that uses a private API to determine the current first responder:
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
You can use that to see what the first responder is, and that may help you find out why you can't get it to resign, if that's indeed the problem.