以编程方式将 IBAction 添加到 UIButton

Posted

技术标签:

【中文标题】以编程方式将 IBAction 添加到 UIButton【英文标题】:Programmatically add IBAction to UIButton 【发布时间】:2011-06-30 12:35:14 【问题描述】:

我正在尝试向 UIButton 添加操作,但不断收到异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“[UIImageView addTarget:action:forControlEvents:]: 无法识别的选择器发送到实例 0x595fba0”

这是我的代码:

- (void)viewDidLoad

    [super viewDidLoad];

    UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
    self.profileButton = (UIButton*)[[UIImageView alloc] initWithImage:myIcon];

    [self.profileButton addTarget:self action:@selector(profileButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithCustomView:profileButton] autorelease];

    NSArray *toolbarItems = [[NSArray alloc] initWithObjects:buttonItem, nil];

    [self setToolbarItems:toolbarItems animated:NO];

    //[toolbarItems release];
    //[profileButton release];

然后我在同一个视图控制器中有这个方法:

-(void)profileButtonPressed:(id)sender


在标题中我有

-(IBAction)profileButtonPressed:(id)sender;

发生了什么事?

【问题讨论】:

【参考方案1】:

您正在将UIImageView 投射到UIButton,它不会响应addTarget:action:forControlEvents:。使用setBackgroundImage:forState:setImage:forState:UIButton 创建实际按钮并为不同状态设置图像。

【讨论】:

【参考方案2】:

为什么要将 UIImageView 投射到按钮中。

UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
self.profileButton = [UIButton buttonWithStyle:UIButtonStyleCustom];
[self.profileButton setImage:myIcon forState:UIControlStateNormal];
[self.profileButton addTarget:self action:@selector(profileButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

【讨论】:

setImage: 或 setImage:forState: ?【参考方案3】:

您不能将UIImageView 对象转换为UIButton 并期望它的行为类似于UIButton。由于您打算创建一个UIBarButtonItem,因此请使用initWithImage:style:target:action: 使用图像对其进行初始化。

UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithImage:myIcon style:UIBarButtonItemStylePlain target:self action:@selector(profileButtonPressed:)] autorelease]; 

我认为这比创建 UIButton 并将其分配为自定义视图更好。

【讨论】:

【参考方案4】:

这看起来很不对:

self.profileButton = (UIButton*)[[UIImageView alloc] initWithImage:myIcon];

UIImageView 不是UIButton。你应该allocinit一个正确的UIButton,然后你可以调用

[self.profileButton setImage: myIcon forState:UIControlStateNormal];

【讨论】:

【参考方案5】:

首先创建您自己的按钮。并在之后添加操作:

UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
UIButton *buttonPlay = [UIButton buttonWithType:UIButtonTypeCustom];
buttonPlay.frame = CGRectMake(0, 0, 20, 20);
[buttonPlay setBackgroundImage:myIcon forState:UIControlStateNormal];
[buttonPlay addTarget:self action:@selector(buttonPlayClick:) forControlEvents:UIControlEventTouchUpInside];

你的选择器应该是这样的

- (void)buttonPlayClick:(UIButton*)sender

现在您可以创建自定义栏项

UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithCustomView:buttonPlay] autorelease];

【讨论】:

以上是关于以编程方式将 IBAction 添加到 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

在 TableViewHeader 中以编程方式调用 IBAction

以编程方式添加的视图对象未显示在情节提要中

以编程方式调用 ibaction 方法不会改变按钮的背景?

从 IBAction 以编程方式设置 UISwitch isOn 再次调用 IBAction

UIButton click(IBAction)没有以编程方式触发

以编程方式设置在视图控制器上添加的对象的标记