2012-11-02 115 views
33

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

子类别UIButton的负面影响是什么?而且我知道它很模糊,但是对UIButton进行子类化还有什么其他的选择?

+1

子类化UIButton的原因是什么?指定按钮类型“自定义”。还需要什么? –

+0

我在问更多是否我想在未来继承,为什么我不应该这样做。但现在我的应用程序中会有大约20个按钮,它们在文本周围具有相同的背景,字体和填充大小等等。所以我想通过子类化将相同的时间和代码相同。 – KKendall

+2

没有理由不能继承UIButton。实际上,我这样做是为了能够使用IB来定义我的按钮的外观。为什么?设计灵活性。 许多人已经分类UIButton。我已经分类了UIButton。这种认为它不能被重复但缺乏证据的东西。 –

回答

35

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 
+0

虽然对于设计很重要,但我不确定“偏好构图”对于这个问题确实是一个很好的答案,因为在这方面“UIButton”实际上是特殊的。我当然不会倒下,因为你的文章确实有好处(事实上,我是upvoted)。 – justin

+0

@justin,我总是赞成良好的谈话!你是否在任何地方写博客,或者在某个地方有相关讨论的链接? –

+3

我在关于这个主题的答案中添加了Cocoa-Dev列表的链接。如果你想联系我,当然欢迎你通过私人或公开的方式给我发消息(处理在我的个人档案中)。我不写博客 - 这是我的主要编码器。我保持低调。 – justin

15

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


On implementing a subclass of UIButton

10

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

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

UIControl子类UIView的,所以你可以清晰地layoutSubviews对您的UIControl子类包含的任何意见,并避免随之而来的UIButton不必要的视图。实质上,你只是创建你自己的'UIButton',但你可以避免必须解决你并不真正需要或不需要的行为和功能。