UIBarButtonItem:目标操作不起作用?

时间:2010-05-09 02:45:05

标签: iphone ios objective-c cocoa-touch

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

10 个答案:

答案 0 :(得分:114)

我认为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

答案 1 :(得分:23)

以下是我的工作原理:

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

UIBarButtonItem* itemAboutUs =[[UIBarButtonItem alloc]initWithCustomView:infoButton];
…

答案 2 :(得分:23)

我遇到了同样的问题,但是反对使用UIButton而不是我UIBarButtonItem的自定义视图(每个抽奖的回复)。

或者,您可以在使用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]; ;这似乎适用于我的项目。

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

{{1}}

答案 3 :(得分: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];

答案 4 :(得分: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];

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

答案 5 :(得分:1)

Jacob,一切看起来都不错,但是你可能没有提供正确的选择器。

您能否验证您的行动是否已实际宣布

- (void) deselectAll;

而不是

- (void) deselectAll:(id)sender;

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

此外,无效可能是IBAction,但这与您遇到的此问题无关。

答案 6 :(得分:1)

Swift 3 :以下是按钮自定义和事件处理的完整实现。

{{1}}

希望这有帮助

答案 7 :(得分:0)

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

答案 8 :(得分:0)

为了使这个易于使用,我在UIBarButtonItem上创建了一个类别,如下所示:

@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中连接目标和操作(尽可能多地将UI配置推送到IB中)。

答案 9 :(得分:0)

Swift 3.我有一个类似的问题,我在条形按钮项目中有一个自定义视图。为了让水龙头工作,我为视图分配了一个手势并设置了动作。该视图需要成为分配给它的出口。这样做可以使用自定义视图。

将手势设置为类变量

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

在viewDidLoad

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