3

我有以下子类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's method buttonPressed

当我启动一个应用程序并使用我的按钮加载我的父 xib 时,awakeFromNib会调用 MyButton 类。但是当我按下按钮时,什么也没有发生。我期待我buttonPressedMyButton课堂方法会被调用。

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

你能建议点什么吗?

4

3 回答 3

4

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

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

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

于 2013-04-17T15:07:00.877 回答
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。

于 2013-04-17T14:02:09.590 回答
2

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

于 2013-04-17T14:13:36.967 回答