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

Sir*_*III 34 subclass objective-c uibutton uikit ios

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

子类化的负面因素是UIButton什么?而且我知道它含糊不清,但是继承子类的其他选择是UIButton什么?

Chr*_*hey 36

Cocoa框架采用Object Composition模式比传统类层次结构更合适的方法.

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

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

编辑,你自己的工厂方法

我注意到您的上述评论是关于在应用中的多个按钮上使用相同的按钮配置时节省时间.这是使用Factory Method设计模式的好时机,在Objective-C中,您可以使用Category实现它,因此可以直接在UIButton上使用它.

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

  • 我在关于这个主题的答案中添加了一个来自Cocoa-Dev列表的链接.如果您想联系我,我们当然欢迎您通过Twitter私下或公开给我发消息(句柄在我的SO资料中).我不博客 - 这是我的主要编码水冷却器.我保持低调. (3认同)

jus*_*tin 15

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


关于实现的子类 UIButton


Jam*_*ett 11

如果您只是想用自己的"子视图"来寻找更轻量级的东西,那么您应该将UIControl子类化.UIButton是UIControl的子类,可以处理事件,例如:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)

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