Search code examples
iosobjective-cuibarbuttonitemclass-method

Custom UIBarButtonItem for UIToolbar


In my testing project, I am planning to have multiple picker views. For these picker views, there will be UIToolbars and custom UIBarButtons. I tried to create a class method so that I will not have to repeat the codes, but it seems like the button is not showing up.

Picker Done Button.h

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (test)
+ (UIBarButtonItem*)barButtonItemWithTint:(UIColor*)color andTitle:(NSString*)itemTitle andTarget:(id)theTarget andSelector:(SEL)selector;
@end

Picker Done Button.m

#import "PickerDoneButton.h"

@implementation UIBarButtonItem (test)
+ (UIBarButtonItem*)barButtonItemWithTint:(UIColor*)color andTitle:(NSString*)itemTitle andTarget:(id)theTarget andSelector:(SEL)selector
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.tintColor = color;
    button.backgroundColor = [UIColor yellowColor];
    [button addTarget:theTarget action:selector forControlEvents:UIControlEventValueChanged];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithCustomView:button];
    return doneButton;
}
@end

And to use this class method on my View Controller.m (I am omitting picker view methods which come after viewDidLoad)

#import "ViewController.h"
#import "PickerDoneButton.h"

@interface ViewController ()
@property (strong, nonatomic) NSArray *numberofPeople;
@property (strong, nonatomic) UIPickerView *countPeople;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.countPeople = [[UIPickerView alloc] init];
    self.countPeople.dataSource = self;
    self.countPeople.delegate = self;
    self.numberofPeople = @[@"1",@"2",@"3"];

    UIToolbar *countPeopleToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,0,50)];
    countPeopleToolbar.barStyle = UIBarStyleBlackOpaque;
    // Call the UIBarButtonItem from PickerDoneButton.h
    countPeopleToolbar.items = @[[UIBarButtonItem barButtonItemWithTint:[UIColor redColor] andTitle:@"Done" andTarget:self andSelector:@selector(doneClicked)]];
    [self pickerView:self.countPeople didSelectRow:0 inComponent:0];
}

Am I using the class method correctly?


Solution

  • Yes you are doing it correct. Only thing you are missing is you are not setting frame of your button to be set inside doneButton. Since button doesn't have any frame set it doesn't show up. Add this after creating button.

    button.frame = CGRectMake(0, 0, 30, 30); // change frame as per your requirement