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

10

这是我的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接受一个参数,选择器就可以正常工作。 - user756245
1
解决方案是将 target = nil 改为 target = self - ArtSabintsev
3个回答

26

你的按钮声明缺少某些内容,即target参数。请尝试以下代码:

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

假设 showPicker: 实际上在将按钮添加到导航项的相同类中。

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


好的,问题已经解决了!这是我第一次通过编程来解决它。感谢您的修复! - ArtSabintsev
不要忘记将其标记为答案,这样每个人都会获胜!谢谢。 - ageektrapped
好的,现在全部完成了。我本来想早点完成,但是它不让我(即,在我能够完成之前还有9分钟...)。感谢您的快速回复! - ArtSabintsev

3
对于那些仍然在处理这个问题的人,我找到了另一种解决方案: 不要这样做:
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的更多知识渊博的人可以评论一下为什么一个解决方案比另一个解决方案有效?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接