UIBarButtonItem:目标操作不起作用?

Jac*_*kin 76 iphone cocoa-touch objective-c ios

我有一个自定义视图UIBarButtonItem,通过调用设置-initWithCustomView.我的条形按钮项呈现正常,但是当我点击它时,它不会调用我的目标对象上的动作.

这是我的代码:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage.png"]];
UIBarButtonItem *bbItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];
self.navigationItem.leftBarButtonItem = bbItem;
[imageView release];
[bbItem setTarget:self];
[bbItem setAction:@selector(deselectAll)];
Run Code Online (Sandbox Code Playgroud)

dra*_*ard 120

我不认为UIBarButtonItem的目标和操作适用于自定义视图.尝试使用UIButton而不是UIImageView,并将目标和操作应用于按钮.

Swift中的示例代码:

let button  = UIButton(type: .Custom)
if let image = UIImage(named:"icon-menu.png") {
    button.setImage(image, forState: .Normal)
}
button.frame = CGRectMake(0.0, 0.0, 30.0, 30.0)
button.addTarget(self, action: #selector(MyClass.myMethod), forControlEvents: .TouchUpInside)
let barButton = UIBarButtonItem(customView: button)
navigationItem.leftBarButtonItem = barButton
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.`UIBarButtonItem`继承自`UIBarItem`和`NSObject`,因此它对触摸一无所知.如果文档提到"action"和"target"属性仅在自定义视图是UIButton时才适用,那将是很好的. (29认同)
  • @JasonMoore:更好的是,如果按钮的作用类似......按钮会很好.如果它的行为与程序员所期望的一样,则不需要额外的文档. (18认同)

Nic*_*uin 23

这是我如何使它工作:

UIButton* infoButton = [UIButton buttonWithType: UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(displayAboutUs) forControlEvents:UIControlEventTouchDown];

UIBarButtonItem* itemAboutUs =[[UIBarButtonItem alloc]initWithCustomView:infoButton];
…
Run Code Online (Sandbox Code Playgroud)


Tim*_*ber 23

我有同样的问题,但是反对使用UIButton自定义视图而不是我的UIBarButtonItem(每个drawonward的响应).

或者,您可以UIGestureRecognizer在使用初始化之前将自定义视图添加到自定义视图中UIBarButtonItem; 这似乎适用于我的项目.

这是我修改原始代码的方法:

UIImageView *SOCImageView = [[UIImageView alloc] initWithImage:
                             [UIImage imageNamed:@"cancel_wide.png"]];

UITapGestureRecognizer *tapGesture = 
       [[UITapGestureRecognizer alloc] initWithTarget:self 
                                               action:@selector(deselectAll:)];
[SOCImageView addGestureRecognizer:tapGesture];

SOItem.leftBarButtonItem = 
       [[[UIBarButtonItem alloc] initWithCustomView:SOCImageView] autorelease];
[tapGesture release];
[SOCImageView release];
Run Code Online (Sandbox Code Playgroud)


Zac*_*tte 9

以下是我在UIBarButtonItem中实现UIButton的方法:

UIButton *logoButton = [UIButton buttonWithType:UIButtonTypeCustom];
[logoButton setImage: [UIImage imageNamed:@"icon.png"] forState:UIControlStateNormal];
logoButton.frame = CGRectMake(0, 0, 30, 30);
[logoButton addTarget:self action:@selector(showAbout:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:logoButton];
self.navigationItem.rightBarButtonItem = barItem;
[barItem release];
Run Code Online (Sandbox Code Playgroud)


Jam*_*ott 7

我遇到了类似的问题.我最初遵循@drawnonward建议的路径,但是当我试图让我的动作在iPad上呈现弹出控制器时遇到麻烦:使用嵌入式UIButton作为自定义视图意味着UIButton是事件的发送者,并且popover控制器的presentPopoverFromBarButtonItem:方法在尝试发送仅适用于实际UIBarButtonItems的消息时崩溃.

我最终找到的解决方案是从一次性UIButton中窃取我想要使用的图像("信息"图标),并按如下方式构造我的UIBarButtonItem:

// Make the info button use the standard icon and hook it up to work
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
UIBarButtonItem *barButton = [[[UIBarButtonItem alloc]        
      initWithImage:infoButton.currentImage
              style:UIBarButtonItemStyleBordered
             target:self
             action:@selector(showInfo:)] autorelease];
Run Code Online (Sandbox Code Playgroud)

使用此初始化程序会生成一个条形按钮,其目标和选择器实际上可用 它比在自定义视图中包装图像更容易,但这只是结冰.