Question

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.

No correct solution

OTHER TIPS

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.

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top