UIBarButtonItem 没有响应点击

Posted

技术标签:

【中文标题】UIBarButtonItem 没有响应点击【英文标题】:UIBarButtonItem not responding to click 【发布时间】:2012-08-30 05:06:58 【问题描述】:

我有一个 UITableView,我希望用户能够在该部分的标题中单击两个按钮,一个用于添加新记录,另一个用于编辑它们,所以我首先尝试使用 tableView viewForHeaderInSectiontableView heightForHeaderInSection 像这样:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
    return 44;


- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
     UIView* v = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 360, 44)];
    UIToolbar* tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 360, 44)];

    UIBarButtonItem* spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    UIBarButtonItem* addBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(onAddVehicleInterest:)];
    UIBarButtonItem* editBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(onEditVehiclesInterest:)];

    [tb setItems:[NSArray arrayWithObjects:spacer, addBtn, editBtn, nil]];

    [v addSubview:tb];
    return v;


- (IBAction)onAddVehicleInterest: (id) sender 
    NSLog(@"Add");


- (IBAction)onEditVehiclesInterest:(id)sender 
    NSLog(@"Edit");

当我运行应用程序时,我可以正确看到三个 UIBarButtonItems,并且可以单击它们,但从未调用过 NSLog 行。所以我直接在 nib 文件中添加了一个UIToolbar,添加了 3 个UIBarButtonItem 控件,并将onAddVehicleInterestonEditVehiclesInterest 绑定到相应的按钮。但这也不起作用......

所以,作为最后的测试,我在笔尖上添加了一个UIButton,并将它的 Touch Up Inside 事件绑定到其中一个方法,并且按预期工作。所以我很困惑。我做错了什么?

【问题讨论】:

我刚刚测试了你的代码,它对我来说运行良好。 谢谢@Ander,你的测试给了我一个想法,我是对的。我在父视图上有一个gestureRecognizer,这弄乱了按钮的事件。一旦我为此添加了一个测试(检查超级视图是否为 UIToolbar),它就可以正常工作了。 【参考方案1】:

我在视图控制器的父视图上有一个 UITapGestureRecognizer。移除点击手势后,我的 UIBarButtonItems 开始正确响应所有选择器。

【讨论】:

【参考方案2】:

我也遇到了同样的问题,我通过更改解决了它:-

- (IBAction)onAddVehicleInterest: (id) sender 
to 
- (IBAction)onAddVehicleInterest: (UIBarButtonItem *) sender 

我也不知道为什么它不能更早地工作,但我的问题已经解决了。 你可以试试这个。

【讨论】:

【参考方案3】:

试试这个:

UIBarButtonItem* addBtn;
if([self respondsToSelector:@selector(onAddVehicleInterest:)])

    addBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(onAddVehicleInterest:)];


UIBarButtonItem* editBtn
if([self respondsToSelector:@selector(onEditVehiclesInterest:)])

    editBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(onEditVehiclesInterest:)];


if(addBtn && editBtn)

   [tb setItems:[NSArray arrayWithObjects:spacer, addBtn, editBtn, nil]];

【讨论】:

以上是关于UIBarButtonItem 没有响应点击的主要内容,如果未能解决你的问题,请参考以下文章

UIBarButtonItem 几乎忽略了每一个动作

检测 uib-popover 何时打开和关闭?

有没有办法将 UIBarButtonItem 的可点击区域设为 44x44?

UIBarButtonItem - 全宽没有灵活空间

月份更改时的 uib-datepicker 警报

RxSwift之UI控件UIButton与UIBarButtonItem扩展的使用