为什么我不应该将UIButton子类化?

时间:2012-11-02 19:55:59

标签: objective-c ios uibutton uikit subclass

关于子类化UIButton的问题,我已经问了几个关于堆栈溢出的问题,有几个人告诉我我不应该继承UIButton

UIButton进行子类化的负面影响是什么?我知道它含糊不清,但是对UIButton

进行子类化的其他替代方法是什么?

3 个答案:

答案 0 :(得分:36)

Cocoa框架采用的方法是对象组合模式比传统的类层次结构更合适。

通常,这意味着UIButton上可能存在一个属性,您可以在其中设置另一个对象来处理按钮的各个方面。这是“自定义”按钮工作方式的首选方式。

此模式的主要原因之一是许多库组件创建按钮,并且不知道您希望它们创建子类的实例。

编辑,您自己的工厂方法

我注意到您上面的注释是关于在应用中的多个按钮上使用相同的按钮配置时节省时间。这是使用Factory Method设计模式的好时机,在Objective-C中你可以implement it with a Category,因此可以直接在UIButton上使用。

@interface UIButton ( MyCompanyFactory )
+(UIButton *) buttonWithMyCompanyStyles;
@end
@implementation UIButton
+(UIButton *) buttonWithMyCompanyStyles {
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom];
    // [theButton set...
    return theButton;
}
@end

答案 1 :(得分:15)

这是因为UIButton有一些特殊之处,因为它有一些复杂性/细微差别/限制(即你要定义的额外覆盖,特别是+buttonWithType:),以使其按预期工作。它比通常的-initWithFrame:(和-initWithCoder:更多,如果在XIB中使用的话)。 IDK为什么框架作者允许这些细节泄露到我们的域中,但这是我们现在必须处理的事情。限制是您的实现不得依赖(即扩展)预设的系统按钮样式;您必须假设UIButtonTypeCustom作为UIButton子类的起点。


On implementing a subclass of UIButton

答案 2 :(得分:11)

如果您只是想用自己的“子视图”寻找更轻量级的东西,那么您应该将UIControl继承为子类。 UIButton是UIControl的子类,可以处理事件,例如:

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

UIControl子类UIView,因此您可以在UIControl子类包含的任何视图上干净地layoutSubviews,并避免UIButton附带的不必要的视图。从本质上讲,您只是创建自己的“UIButton”,但是您可以避免必须解决您不想要或不需要的行为和功能。