Jacob 有一个很好的观点,即类别方法与子类方法的作用不同。Apple 强烈建议您只提供全新的类别方法,因为否则可能会出错 - 其中之一是定义类别方法基本上会删除同名方法的所有其他现有实现。
不幸的是,对于您正在尝试做的事情,UIButton
似乎是专门为避免子类化而设计的。获得 a 实例的唯一认可方法UIButton
是通过构造函数[UIButton buttonWithType:]
。像 Jacob 这样的子类的问题表明(像这样):
@implementation MyCustomButton
+ (id)buttonWithType:(UIButtonType)buttonType {
return [super buttonWithType:buttonType]; //super here refers to UIButton
}
@end
是返回的类型[MyCustomButton buttonWithType:]
仍然是 a UIButton
,而不是 MyCustomButton
。因为 Apple 没有提供任何UIButton
init 方法,所以子类实际上没有办法实例化自身并正确初始化为UIButton
.
如果您想要一些自定义行为,您可以创建一个自定义UIView
子类,该子类始终包含一个按钮作为子视图,以便您可以利用某些UIButton
功能。
像这样的东西:
@interface MyButton : UIView {}
- (void)buttonTapped;
@end
@implementation MyButton
-(id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = self.bounds;
[button addTarget:self action:@selector(buttonTapped)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
return self;
}
- (void)buttonTapped {
// Respond to a button tap.
}
@end
如果您希望按钮根据更复杂的用户交互执行不同的操作,您可以[UIButton addTarget:action:forControlEvents:]
针对不同的控件事件进行更多调用。
参考:Apple 的 UIButton 类参考