UIBarButtonItem:目标行动不工作?

我有一个UIBarButtonItem的自定义视图,通过调用UIBarButtonItem设置。 我的酒吧button项呈现罚款,但是当我点击它,它不会调用我的目标对象的行动。

这是我的代码:

 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)]; 

我不认为UIBarButtonItem的目标和行动适用于自定义视图。 尝试使用UIButton而不是UIImageView并将目标和操作应用于button。

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 

以下是我如何使其工作:

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

我有同样的问题,但反对使用UIButton而不是自定义视图为我的UIBarButtonItem (每drawnonward的回应)。

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

这是我将如何修改您的原始代码:

 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]; 

下面是我如何实现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]; 

我有一个类似的问题。 我最初遵循@drawnonward所build议的path,但是当我尝试让我的行为在iPad上显示popover控制器时遇到了麻烦:使用embedded的UIButton作为自定义视图意味着UIButton是事件的发送者, popover控制器的presentPopoverFromBarButtonItem:方法在尝试发送只适合实际UIBarButtonItems的消息时崩溃。

我最终发现的解决scheme是从一次性的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]; 

使用这个初始化器会产生一个实际上工作的目标和select器的button。 它也比在自定义视图中包装图像更容易,但这只是结冰。

雅各布,一切看起来不错,但是你可能没有提供正确的select。

你能证实你的行为是真正被宣布的吗?

 - (void) deselectAll; 

并不是

 - (void) deselectAll:(id)sender; 

如果是后者,则需要将操作设置为@selector(deselectAll:) 。 (注意匹配方法声明的分号)

另外,void可能是IBAction ,但是这与你遇到的这个问题没有关系。

您的自定义视图是否在触摸事件或将其传递给父视图?

为了使这个工作变得容易,我在UIBarButtonItem上创build了一个类,如下所示:

 @implementation UIBarButtonItem (CustomButtonView) - (void)setButtonImage:(UIImage *)image { UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setBackgroundImage:image forState:UIControlStateNormal]; [button sizeToFit]; [button addTarget:self.target action:self.action forControlEvents:UIControlEventTouchUpInside]; self.customView = button; } - (UIImage *)buttonImage { return [(UIButton *)self.customView imageForState:UIControlStateNormal]; } @end 

在您的客户端代码中,只需使用:

 myBarButtonItem.buttonImage = [UIImage imagedNamed:@"image_name"]; 

通过这种方式,您仍然可以在IB中连接您的目标和行为(尽可能多地将UIconfiguration推送到IB中,这是一件好事)。

Swift 3.我有一个类似的问题,我有一个自定义视图内的酒吧button项目。 为了让点击工作,我分配了一个手势的视图和设置的行动。 这个观点需要成为一个分配给它的出路。 这样做,它与自定义视图。

将手势设置为类variables

 @IBOutlet weak var incidentView: UIView! let incidentTap = UITapGestureRecognizer() 

在viewDidLoad中

 incidentTap.addTarget(self, action: #selector(self.changeIncidentBarItem)) incidentView.addGestureRecognizer(incidentTap) 

如果您不想使用UIImage并在您的barbuttonitem中使用自定义视图,请将点按手势识别器设置为您的barbuttonitem的customview属性

let tap = UITapGestureRecognizer(target: self, action: #selector(goProButtonPressed)) deviceStatusBarButtonItem.customView?.addGestureRecognizer(tap)

Swift 3 :下面是我对button自定义和事件处理的完整实现。

 override func viewDidLoad() { super.viewDidLoad() let button = UIButton.init(type: .custom) button.setTitle("Tester", for: .normal) button.setTitleColor(.darkGray, for: .normal) button.layer.borderWidth = 1 button.layer.cornerRadius = 5 button.layer.borderColor = UIColor.darkGray.cgColor button.addTarget(self, action: #selector(self.handleButton), for: .touchUpInside) self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if let button = self.navigationItem.rightBarButtonItem?.customView { button.frame = CGRect(x:0, y:0, width:80, height:34) } } func handleButton( sender : UIButton ) { // It would be nice is isEnabled worked... sender.alpha = sender.alpha == 1.0 ? 0.5 : 1.0 } 

希望这可以帮助