为什么我不应该继承UIButton?
我已经提出了关于子类化UIButton
的堆栈溢出的几个问题,并且有几个人告诉我,我不应该子类化UIButton
。为什么我不应该继承UIButton?
子类别UIButton
的负面影响是什么?而且我知道它很模糊,但是对UIButton
进行子类化还有什么其他的选择?
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
这是因为UIButton
是那种特别有几个复杂/微妙之处/限制(即额外的覆盖,为您定义,尤其是+buttonWithType:
),以便它能够按预期工作所需。它比通常的-initWithFrame:
(和-initWithCoder:
,如果在XIB中使用)更多。 IDK为什么框架作者允许这些细节泄漏到我们的域中,但现在我们必须处理这些细节。限制是您的实现不能依赖于(即扩展)预设的系统按钮样式;您必须假设UIButtonTypeCustom
作为UIButton
子类的起点。
如果你只是寻找一些更轻巧的用自己的“子视图”你应该改为继承UIControl。 UIButton的子类UIControl,可以处理事件,如:
[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];
UIControl子类UIView的,所以你可以清晰地layoutSubviews对您的UIControl子类包含的任何意见,并避免随之而来的UIButton不必要的视图。实质上,你只是创建你自己的'UIButton',但你可以避免必须解决你并不真正需要或不需要的行为和功能。
子类化UIButton的原因是什么?指定按钮类型“自定义”。还需要什么? –
我在问更多是否我想在未来继承,为什么我不应该这样做。但现在我的应用程序中会有大约20个按钮,它们在文本周围具有相同的背景,字体和填充大小等等。所以我想通过子类化将相同的时间和代码相同。 – KKendall
没有理由不能继承UIButton。实际上,我这样做是为了能够使用IB来定义我的按钮的外观。为什么?设计灵活性。 许多人已经分类UIButton。我已经分类了UIButton。这种认为它不能被重复但缺乏证据的东西。 –