自定义UIButton的操作未调用

时间:2013-04-17 13:54:30

标签: iphone ios objective-c cocoa-touch uibutton

我有UIButton的子类:

@interface MyButton : UIButton
- (IBAction) buttonPressed:(id)sender;
@end

@implementation MyButton

- (void)awakeFromNib
{
    NSLog(@"awake from nib");
}


- (IBAction) buttonPressed:(id)sender
{
    NSLog(@"button pressed");
}

@end

我在父xib中添加了一个按钮,将其类设置为MyButton,并将其操作连接到First Responder的方法buttonPressed

当我启动一个应用程序并使用我的按钮加载我的父xib时,调用来自MyButton类的awakeFromNib。但是当我按下按钮时,没有任何反应。我原以为我会调用buttonPressed类的方法MyButton

我认为,我的按钮的视图是响应者链中的第一个响应者,但显然我做错了。

你能提出一些建议吗?

3 个答案:

答案 0 :(得分:3)

根据您使用按钮的操作而定 - 不需要创建子类。

以下是一些代码如何创建一个触发方法的简单按钮:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton setFrame:CGRectMake(10, 10, 100, 30)];
[myButton setTitle:@"Title" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:myButton];

当用户触摸按钮内部(轻击按钮)时,添加目标位告诉按钮触发给定的选择器。目标是选择器所在的对象。

希望这有帮助,除非您拥有自定义布局或特定的自定义功能,否则您不需要继承UIButton。

答案 1 :(得分:3)

如果您希望按钮始终调用声明的方法,请将上面的代码添加到awakeFromNib方法

[self addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

以后,当您将其添加到视图控制器时,请不要为其分配新操作,这样它将始终调用您的方法。

答案 2 :(得分:2)

由于您希望处理按钮代码本身的操作,您可能必须覆盖此方法- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents并处理您的事件,就好像它已发送到您的按钮一样;