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
jus*_*tin 15
这是因为UIButton有一些特殊之处在于,+buttonWithType:为了使其按预期工作,需要一些复杂性/细微差别/限制(即,您需要定义的额外覆盖,特别是).它比通常的更多-initWithFrame:(-initWithCoder:如果在XIB中使用的话).IDK为什么框架作者允许这些细节泄露到我们的域中,但这是我们现在必须处理的事情.限制是您的实现不得依赖(即扩展)预设的系统按钮样式; 您必须将其UIButtonTypeCustom作为UIButton子类的起点.
Jam*_*ett 11
如果您只是想用自己的"子视图"来寻找更轻量级的东西,那么您应该将UIControl子类化.UIButton是UIControl的子类,可以处理事件,例如:
[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];
UIControl是UIView的子类,因此您可以在UIControl子类包含的任何视图上干净地layoutSubviews,并避免UIButton附带的不必要的视图.从本质上讲,您只是创建自己的"UIButton",但您不必解决您不想要或不需要的行为和功能.
| 归档时间: | 
 | 
| 查看次数: | 25771 次 | 
| 最近记录: |