user1654889
user1654889

Reputation: 319

Why UITextField becomeFirstResponder returns NO?

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.

Upvotes: 7

Views: 9745

Answers (5)

AppHandwerker
AppHandwerker

Reputation: 1788

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.

Upvotes: 2

devios1
devios1

Reputation: 37985

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.

Upvotes: 5

aironik
aironik

Reputation: 105

Is your identificationField in UIView hierarchy? If it hasn't added into window and shown it cannot became first responder.

Upvotes: 6

Gavin
Gavin

Reputation: 8200

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.

Upvotes: 1

rmaddy
rmaddy

Reputation: 318774

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.

Upvotes: 0

Related Questions