objective-ccocoa-touchuitoolbaruibariteminputaccessoryview

Why UIBarButtonItem not getting clicks in UIToolbar set as inputAccessoryView of UITextField?


UIBarItem does not respond to clicks inside UIToolbar which is setup as inputAccessoryView on a UITextField.

The button does not show click animation when I try to click it, callback does not get called. My setup looks like:

@interface MyViewController()
@property (weak, nonatomic) IBOutlet UITextField *closeDateTextField;
@property (strong, nonatomic) UIToolbar * datePickerToolbar;
@end

I setup toolbar with button:

- (void)viewDidLoad {

    self.datePickerToolbar = [[UIToolbar alloc] init];
    UIBarButtonItem * doneBtn =
        [[UIBarButtonItem alloc]
                initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                target:self
                action:@selector(hidePicker:)];

add button to toolbar and set toolbar as inputAccessoryView of UITextField:

    [self.datePickerToolbar setItems:@[doneBtn] animated:NO];
    self.closeDateTextField.inputAccessoryView = self.datePickerToolbar;
}

When I click on closeDateTextField the keyboard appears with a Done button in toolbar but the button does not respond to click, the hidePicker: does not get called.

- (void)hidePicker:(id)sender {
    [self.closeDateTextField resignFirstResponder];
}

Any idea what I'm doing wrong?


Solution

  • I just tried the following code and it worked just fine. Tested on both iOS 6 & 7 simulator.

    @interface HSViewController
    
    @property (weak, nonatomic) IBOutlet UITextField *closeDateTextField;
    @property (strong, nonatomic) UIToolbar * datePickerToolbar;
    
    @end
    
    @implementation HSViewController
    
    - (void)viewDidLoad
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
        [super viewDidLoad];
    
        self.datePickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        UIBarButtonItem * doneBtn =
        [[UIBarButtonItem alloc]
         initWithBarButtonSystemItem:UIBarButtonSystemItemDone
         target:self
         action:@selector(hidePicker:)];
        [self.datePickerToolbar setItems:@[doneBtn] animated:NO];
    
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 320, 120)];
        textField.backgroundColor = [UIColor greenColor];
        [self.view addSubview:textField];
        self.closeDateTextField = textField;
        self.closeDateTextField.inputAccessoryView = self.datePickerToolbar;
    }
    
    - (void)hidePicker:(id)sender {
        NSLog(@"%s", __PRETTY_FUNCTION__);
        [self.closeDateTextField resignFirstResponder];
    }
    
    @end