以编程方式创建的 UIBarButtonItem 未启动选择器操作

Posted

技术标签:

【中文标题】以编程方式创建的 UIBarButtonItem 未启动选择器操作【英文标题】:Programmatically created UIBarButtonItem Not Launching Selector Action 【发布时间】:2011-07-12 18:55:49 【问题描述】:

这是我的UIBarButton

[self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc] 
                            initWithTitle:@"+ Contact" 
                                    style:UIBarButtonItemStylePlain 
                                   target:nil 
                                   action:@selector(showPicker:)] animated:YES];

这是它应该启动的代码:

- (void)showPicker:(id)sender 
    ABPeoplePickerNavigationController *picker = 
     [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;

    [self presentModalViewController:picker animated:YES];
    [picker release];

当我启动应用程序并单击“+ 联系人”UIBarButton 时,没有任何反应。没有错误,纳达。我放了一个断点,它永远不会到达选择器引用的方法。

我在调用选择器的方式上做错了吗?

谢谢!

【问题讨论】:

只要showPicker 确实有一个参数,选择器就可以了。 解决方案是target = self,而不是target = nil 【参考方案1】:

按钮的声明缺少一些东西,即target 参数。试试这个:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"+ Contact" 
                                 style:UIBarButtonItemStylePlain 
                                target:self 
                                action:@selector(showPicker:)];
[self.navigationItem setLeftBarButtonItem:item animated:YES];

这假定showPicker: 实际上与将按钮添加到导航项的类属于同一类。

target 参数是应该处理事件的实例。

【讨论】:

是的,解决了!第一次以编程方式执行此操作。感谢修复! 别忘了把这个标记为答案,那么每个人都会赢!谢谢。 是的,现在全部完成。我本来打算早点做的,但它不允许我这样做(即,在我做之前还有 9 分钟......)。感谢您的快速回复!【参考方案2】:

对于那些仍然有这个问题的人,这是我找到的另一个解决方案: 而不是这样做:

self.myBarButton = 
  [[UIBarButtonItem alloc] initWithTitle:@"Woot Woot"
                                   style:UIBarButtonItemStyleBordered 
                                  target:self 
                                  action:@selector(performActionForButton)];

试试这样的:

NSArray *barButtons = [self.myToolbar items];
UIBarButtonItem *myBarButton = [barButtons objectAtIndex:0];
[myBarButton setAction:@selector(performActionForButton)];

*确保您已在 Storyboard 的工具栏中添加了此 UIBarButtonItem。 (或者您可以在这组代码之前以编程方式创建自己的UIBarButtonItem,并将其添加到 UIToolbar 的 items 数组中。)

不知何故,ageektrapped 的解决方案对我不起作用,尽管我更愿意使用他的解决方案。也许对 UIBarButtonItems 更了解的人可以评论为什么一种解决方案优于另一种解决方案?

【讨论】:

【参考方案3】:

“目标”应该是选择器所属的对象,而不是 nil。

【讨论】:

以上是关于以编程方式创建的 UIBarButtonItem 未启动选择器操作的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从 UIBarButtonItem

使用 Swift 以编程方式创建的 UIBarButtonItem,不可见

以编程方式在Swift中添加UIBarButtonItem操作

按下时以编程方式移除 UIBarButtonItem 上的灯光?

如何以编程方式将自定义图像设置为 UIBarButtonItem

以编程方式添加UIBarButtonItem