为什么我不应该inheritance一个UIButton?

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

子类化UIButton的负面影响是什么? 而且我知道它是模糊的,但是UIButton子类化还有什么其他的select?

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

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

这种模式的主要原因之一是许多库组件创buildbutton,并不知道你希望他们创build你的子类的实例。

编辑,你自己的工厂方法

当您在应用程序中的许多button上具有相同的buttonconfiguration时,我注意到上面关于保存时间的注释。 这是使用Factory Methoddevise模式的好时机,在Objective-C中,您可以使用类别实现它,以便直接在UIButton上使用。

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

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


在实现UIButton的子类

如果你只是寻找更轻巧的东西你自己的“子视图”,你应该改为UIControl的子类。 UIButton的子类UIControl,可以处理事件,如:

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

UIControl子类UIView所以你可以干净的UIControl子类包含的任何意见layoutSubviews,并避免UIButton随附的不必要的意见。 实质上,你只是创build你自己的'UIButton',但是你可以避免不必要的行为和function。