2013-10-21 28 views
0

我的项目中有几个实用程序类,它们是基于少数参数生成UIElements的工厂类。例如,考虑这是一个很抽象的例子,使用xcode接口生成器的工厂方法

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中使用的UI元素这种方法(例如按钮在这种情况下)?

对于非Interface Builder的元素(代码完成),我只是用它像这样>

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

感谢

+0

只需在您的界面构建器上放置一个按钮,然后将其类更改为您的自定义类MyButtonFactory – Priyatham51

+0

是的,但是如何获取正确的按钮类型?我的工厂类给出了一个基于传入“buttonWithType:”方法的类型的按钮。 – nsuinteger

回答

2

编辑:不明确的,你的类型是什么意思。你的意思是行为还是简单的自定义绘图?是否有任何理由使用自定义按钮单元格或子类不适合你?

你不能直接这样做。 (见apple docs

GUI元素的UIView的子类,这样他们将与调用初始化initWithFrame:

你可以实现initWithFrame和/或alloc叫进厂,但是,似乎是设计不良。

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

还有其他选项取决于你正在尝试做什么。如果你想一切都设置一个自定义单元格类所有的按钮,你可以做这样的事情:

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

我曾经写了AppKit的一个主题化引擎,推翻NSControls allocWithZone:方法来查找类替代品,但不是工厂,听起来不像你想要的。

+0

感谢您的意见。基本上我一直在使用这种工厂类来达到主题目的(不仅是按钮,而且是文本框),我已经习惯了它,因为我一直在做代码中的所有事情。但不幸的是,我分配到的当前项目完全由IB来完成,我试图找到一种更简单的方法来应用我的惯例,而无需在代码中重写所有内容。我希望你现在能更好地理解我的情况。 编辑:类型是在枚举中定义的按钮类型(代码更新问题) – nsuinteger

+0

我明白了。那么你的工厂实际上只是将设置应用于按钮等,或者你有它使用的子类? –

+0

不是真正的子类化,MyButtonFactory是UIButton本身的一个子类,它使用一个工厂方法来初始化和自定义基于该属性的各种属性(包括在drawrect中执行的一些自定义绘图等)。但你的第一个回答引导我走向正确的方向。我将在工厂类中添加'setType:(MyButtonType)类型'方法并使用代码在运行时设置它。我感觉到它应该没有打嗝。 – nsuinteger