Iphone 自定义UIButton';我们不需要采取行动

Iphone 自定义UIButton';我们不需要采取行动,iphone,ios,objective-c,cocoa-touch,uibutton,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"); } @en

我有
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,并将它的操作连接到第一响应者的方法
按钮按下

当我启动一个应用程序并加载包含按钮的父xib时,调用MyButton类中的
awakeFromNib
。但当我按下按钮时,什么也没发生。我希望调用
MyButton
类中的方法
buttonPressed

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


你能给我一些建议吗?

这取决于你用按钮做了什么-根本不需要创建子类

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

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进行子类化。

因为您希望从按钮代码本身处理操作,您可能必须重写此方法
-(void)sendActionsForControlEvents:(UIControlEvents)控制事件
,并将事件处理为发送到按钮

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

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

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

这似乎是尝试为按钮创建自定义操作的完全错误的方法。您对Objective-C编程有经验吗?@DanF目标是在不同的XIB中使用此按钮,而不复制粘贴操作,这在所有情况下都是一样的。你能推荐另一种方法吗?谢谢。仍然无法理解为什么它不能与
addTarget:nil
一起工作,但至少它可以与
addTarget:self
一起工作。当调用
addTarget:action:forControlEvents:
时,您告诉编译器,当生成最后一个参数中指定的事件时,它必须调用在Target参数上指定的对象的action中定义的选择器,如果您指定
nil
,那么该方法被发送到
nil
,我想,
addTarget:nil
意味着相同,如果我将action连接到IB中的第一个响应程序,这意味着系统应该使用响应者链来调度动作。(我从这里了解到:)如果这是正确的,那么我希望我的按钮的方法将被称为第一响应者的方法。我不明白为什么它不能像预期的那样工作。是的,这就是它在IB中的工作方式,但从代码上看它不一样,从代码上你必须指定目标和操作