Alex Block
Alex Block

Reputation: 13

iOS 6 - Responding to Keyboard Done Button State

In the iOS Apprentice Series eBooks, you are supposed to build a Checklist app. The tutorials have you go through and make a Done button on a button bar that is disabled and enabled based on the text inside of a UITextField object.

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range     replacementString:(NSString *)string
{
NSString *newText = [theTextField.text stringByReplacingCharactersInRange:range withString:string];

self.doneBarButton.enabled = ([newText length] > 0);

return YES;
}

Now, the keyboard is set to disable the Done button (on the keyboard) if the text field is empty. Is there a way to observe the state of the keyboard done button and have the done button bar button reflect it accordingly?

IE, when the keyboard done button is enabled, the button bar done button is enabled.

Upvotes: 0

Views: 1007

Answers (2)

rmaddy
rmaddy

Reputation: 318774

UITextField supports what you want through the enablesReturnKeyAutomatically property. This property is from the UITextInputTraits protocol.

When you create your UITextField, set this property.

self.textField.enablesReturnKeyAutomatically = YES;

This means the Return key (whatever it is labeled) will automatically becomes disabled if the text field is empty. And it automatically becomes enabled when text is entered.

There is no way to observe the state of this so you must implement the code you already have for textField:shouldChangeCharactersInRange:replacementString: to update your other Done button.

Upvotes: 1

Oscar
Oscar

Reputation: 651

You may add a target on your text field with the following events.

UIControlEventEditingDidBegin    
UIControlEventEditingChanged     
UIControlEventEditingDidEnd      
UIControlEventEditingDidEndOnExit
UIControlEventAllEditingEvents

Example: In viewDidLoad

[_textField addTarget:self action:@selector(textFieldEditing:) forControlEvents:UIControlEventAllEditingEvents];

Action Method:

- (void)textFieldEditing:(id)sender
{
    _doneButton.enable = ([[sender text] length]>0);
}

Upvotes: 0

Related Questions