以编程方式创建的 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 未启动选择器操作的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 以编程方式创建的 UIBarButtonItem,不可见
以编程方式在Swift中添加UIBarButtonItem操作
按下时以编程方式移除 UIBarButtonItem 上的灯光?