0

我的项目中很少有实用程序类,它们是基于少数参数生成 UIElements 的工厂类。例如,将其视为一个非常抽象的示例,

typedef NS_OPTIONS(NSUInteger, MyButtonType)
{
MyButtonRed,
MyButtonBlue,
MyButtonGray,
// ... 

}

@interface MyButtonFactory: UIButton 

+ (UIButton *)buttonWithType:(MyButtonType)type // mybuttontype is an enum which contains various different type of buttons.

@end

我的问题是如何在 InterfaceBuilder 中将此方法用于 UIElements(例如,在这种情况下为按钮)?

对于非界面构建器元素(在代码中完成),我只是像这样使用它>

UIButton *button = [MyButtonFactory buttonWithType:MyButtonRed];
button.frame = (CGRect){ a, b, c, d }; 
// etc 

谢谢

4

1 回答 1

2

编辑:不清楚你所说的类型是什么意思。你的意思是行为还是简单的自定义绘图?是否有任何理由使用自定义按钮单元或子类对您不起作用?

您不能直接执行此操作。(见苹果文档

GUI 元素是 UIView 的子类,因此它们将通过调用initWithFrame:

您可以实施initWithFrame和/或alloc调用工厂,但这似乎是糟糕的设计。

他们也会收到一条awakeFromNib消息。您可以调整您的工厂来配置元素,而不是直接创建它们(我知道不是真正的工厂)。在类别中覆盖awakeFromNib以使其将自身传递给配置器。

还有其他选择,具体取决于您要做什么。如果您只想为所有按钮设置一个自定义单元格类,您可以执行以下操作:

+ (void)initialize
{
    // force custom button cell class
    [self setCellClass:[CustomButtonCell class]];
}

我曾经为 AppKit 编写了一个主题引擎,它覆盖 NSControlsallocWithZone:方法来查找类替换,但这不是工厂,听起来不像你想要的。

于 2013-10-21T17:16:54.297 回答