2013-08-01 58 views
3

我看過多次,我們不應該繼承的組件(一個UIButton例如)範疇:子類VS與Interface Builder的

問題是,當我使用Interface Builder。 例如,我在很多視圖中都有一個精確外觀的按鈕。我可以每次使用IB設置它們(這很痛苦),或者我可以使用自定義類來分解自定義行爲和外觀。

對我來說,簡化IB程序的唯一方法就是按照每個人都建議的方式來做,這似乎有點矛盾。

有沒有更好的解決方案?我可以使用IB的類別嗎?

謝謝。

回答

2

你提供的第二個鏈接非常清晰,這幾乎是蘋果自己說的,子類,但從來沒有弄亂內部結構。

最好的例子是iOS 7,現在情況完全不同了,例如,我維護的應用程序有一個子類UIControl,現在它在新iOS上運行時遇到問題,僅僅是因爲它是用假設構建的關於內部結構如何工作(迭代內部subviews替換一些事情)。你可能不會讓你的應用程序被拒絕,但這將是一個**維護的痛苦。

作爲一個經驗法則,任何你可以從外面做一個的UIButton,這樣的事情:

[myButton setBackgroundImage:... forState:...]; 
[myButton setTextColor:... forState:...]; 
myButton.titleLabel.font = ... 

您可以將它移動到一個自定義子類方法內部:

+ (UIButton*)fancyPantsButton 
{ 
    UIButton *button = [UIButton butonWithType:UIButtonTypeCustom]; 

    [myButton setBackgroundImage:... forState:...]; 
    [myButton setTextColor:... forState:...]; 
    myButton.titleLabel.font = ... 

    return button; 
} 

你也可以做到這一點initawakeFromNib沒有問題(我通常更喜歡後者)。

UIAppearence也是一個選項,正如用戶hw731所建議的那樣。無論怎樣漂浮你的船,真的。

至於第二個問題,筆尖文件非常創建實例類,然後填寫在IT賣場加載時使用setValue:forKey:的東西(這就是爲什麼你得到一個錯誤「類不是鍵值兼容的東西」當你擰上一個筆尖時),所以如果在筆尖加載時對某物進行分類,那麼是的,筆尖尊重類別,因爲它只是使用initWithCoder ..然後填補空白。

同樣,由於不知道它們,因此nib文件將無法填充自定義屬性,除非您明確將它們添加到IB的「用戶定義的運行屬性」中(iOS 5以上)。

爲碎粒的另一種技術,是使用

@property (strong) IBOutletCollection(UIButton) NSArray *buttons; 

然後迭代,並相應地自定義按鈕(經由一個子類,類別,本地方法,...是它)。如果您只需要少量自定義按鈕,但該方法不足以保證使用子類,則此方法非常有用。

+0

不完美,但我會做。 –

3

您可能可以使用UIView外觀代理。我不知道你在做你的按鈕,什麼都,但是這可能幫助:

將這個在application:didFinishLaunchingWithOptions:方法您的AppDelegate文件

if([UIButton conformsToProtocol:@protocol(UIAppearanceContainer)]){ 
    [[UIButton appearance] setBackgroundImage:[UIImage imageNamed:@"YourImage"] forState:UIControlStateNormal]; 
    //modify any other UIButton properties you want to set globally 
} 
2

我看不出有任何理由,你不應該不要繼承UIButton,特別是爲了使您的IB更易於配置。您提供的任何鏈接都不能解釋爲什麼您不應該繼承,所以他們的斷言看起來並不可靠。另一方面,UIButton.h中存在UIButtonTypeCustom給人的印象是框架作者計劃使用UIButton子類。