Objective c 为什么不应该';我不能将UIButton子类化吗?

Objective c 为什么不应该';我不能将UIButton子类化吗?,objective-c,ios,uibutton,uikit,subclass,Objective C,Ios,Uibutton,Uikit,Subclass,我问了几个关于堆栈溢出的问题,关于子类化UIButton,有几个人告诉我不应该子类化UIButton 将ui按钮子类化的负面影响是什么?我知道这很模糊,但是除了子类化UIButton,还有什么其他选择呢?Cocoa框架采用的方法是,对象组合模式比传统的类层次结构更合适 通常,这意味着UIButton上可能有一个属性,您可以在其中设置另一个对象来处理按钮的各个方面。这是“自定义”按钮工作方式的首选方法 这种模式的主要原因之一是,许多库组件创建按钮,但不知道您希望它们创建子类的实例 编辑,您自己的工

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


ui按钮子类化的负面影响是什么?我知道这很模糊,但是除了子类化
UIButton
,还有什么其他选择呢?

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

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

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

编辑,您自己的工厂方法 我注意到你在上面关于节省时间的评论,当你在应用程序中的许多按钮上使用相同的按钮配置时。现在是使用Factory方法设计模式的好时机,在Objective-C中,您可以直接在UIButton上使用它

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

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



如果您只是想通过自己的“子视图”寻找更轻量级的内容,那么您应该将UIControl子类化。UIButton子类UIControl,可以处理事件,如:

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

UIControl子类UIView,因此您可以在您的UIControl子类包含的任何视图上清晰地布局子视图,并避免UIButton附带的不必要视图。本质上,您只是在创建自己的“UIButton”,但您避免了围绕您并不真正想要或需要的行为和功能进行工作。

您将UIButton子类化的原因是什么?指定按钮类型
自定义
。还需要什么?我在问更多的问题,如果我将来想子类化,为什么我不应该这样做。但现在,我的应用程序中大约有20个按钮,它们的背景、字体、文本周围的填充大小等都相同。因此,我想通过子类化来实现一些时间和代码的相同。没有理由不能子类化UIButton。事实上,我这样做是为了使用IB定义按钮的外观。为什么?设计灵活性。许多人都将UIButton子类化。我已将UIButton子类化。这种认为它不可能的想法是重复的,但缺乏证据。子类化
UIButton
和其他组件一样完全可以。但对于更复杂的子类化(如自定义标签、图像视图等),
UIControl
子类始终是更好的主意。虽然对设计很重要,但我不确定“偏好合成”是否真的是一个好答案,因为
UIButton
在这方面实际上是独特的。我当然不会投反对票,因为你的帖子确实很有价值(事实上,我投了更高的票)。@justin,我总是支持良好的对话!你是否在任何地方写博客,或者在某个地方有相关讨论的链接?我在回答这个问题时添加了Cocoa开发者列表中的链接。如果你想联系我,当然欢迎你通过twitter私下或公开给我发消息(handle在我的SO档案中)。我不写博客——我的主要代码是水冷器。我保持低调。如何将此类别应用于使用故事板添加到UIViewController的UIButton?我尝试在UIViewControllers.m文件中导入该类别,但没有成功。我遗漏了什么吗?@2rec很遗憾,你不能告诉故事板使用自定义工厂方法来创建其中的按钮。我的建议是,如果您想在序列图像板创建的按钮中使用一组可重复使用的预定义按钮样式,只需在序列图像板中使用“复制/粘贴”,或者在UIButton上创建一个UI配置方法(而不是工厂方法)作为类别,然后在viewDidLoad或中的按钮上调用该方法viewDidAppear@Nate,修好了。