2013-10-21 44 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