2012-11-02 112 views
33

我已經提出了關於子類化UIButton的堆棧溢出的幾個問題,並且有幾個人告訴我,我不應該子類化UIButton爲什麼我不應該繼承UIButton?

子類別UIButton的負面影響是什麼?而且我知道它很模糊,但是對UIButton進行子類化還有什麼其他的選擇?

+1

子類化UIButton的原因是什麼?指定按鈕類型「自定義」。還需要什麼? –

+0

我在問更多是否我想在未來繼承,爲什麼我不應該這樣做。但現在我的應用程序中會有大約20個按鈕,它們在文本週圍具有相同的背景,字體和填充大小等等。所以我想通過子類化將相同的時間和代碼相同。 – KKendall

+2

沒有理由不能繼承UIButton。實際上,我這樣做是爲了能夠使用IB來定義我的按鈕的外觀。爲什麼?設計靈活性。 許多人已經分類UIButton。我已經分類了UIButton。這種認爲它不能被重複但缺乏證據的東西。 –

回答

35

Cocoa框架採取的方法是對象組合模式比傳統的類層次結構更合適。

通常,這意味着UIButton中可能有一個屬性,您可以在其中設置另一個對象來處理按鈕的各個方面。這是「定製」按鈕工作方式的首選方式。

這種模式的主要原因之一是許多庫組件創建按鈕,並不知道你希望它們創建你的子類的實例。

編輯自己的工廠方法

我注意到上面大約節省了時間,當你在你的應用程序在多個按鈕相同的按鈕配置您的評論。這是使用Factory Method設計模式的好時機,在Objective-C中,您可以使用implement it with a Category,因此它可以直接在UIButton上使用。

@interface UIButton (MyCompanyFactory) 
+(UIButton *) buttonWithMyCompanyStyles; 
@end 
@implementation UIButton 
+(UIButton *) buttonWithMyCompanyStyles { 
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // [theButton set... 
    return theButton; 
} 
@end 
+0

雖然對於設計很重要,但我不確定「偏好構圖」對於這個問題確實是一個很好的答案,因爲在這方面「UIButton」實際上是特殊的。我當然不會倒下,因爲你的文章確實有好處(事實上,我是upvoted)。 – justin

+0

@justin,我總是贊成良好的談話!你是否在任何地方寫博客,或者在某個地方有相關討論的鏈接? –

+3

我在關於這個主題的答案中添加了Cocoa-Dev列表的鏈接。如果你想聯繫我,當然歡迎你通過私人或公開的方式給我發消息(處理在我的個人檔案中)。我不寫博客 - 這是我的主要編碼器。我保持低調。 – justin

15

這是因爲UIButton是那種特別有幾個複雜/微妙之處/限制(即額外的覆蓋,爲您定義,尤其是+buttonWithType:),以便它能夠按預期工作所需。它比通常的-initWithFrame:(和-initWithCoder:,如果在XIB中使用)更多。 IDK爲什麼框架作者允許這些細節泄漏到我們的域中,但現在我們必須處理這些細節。限制是您的實現不能依賴於(即擴展)預設的系統按鈕樣式;您必須假設UIButtonTypeCustom作爲UIButton子類的起點。


On implementing a subclass of UIButton

10

如果你只是尋找一些更輕巧的用自己的「子視圖」你應該改爲繼承UIControl。 UIButton的子類UIControl,可以處理事件,如:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside]; 

UIControl子類UIView的,所以你可以清晰地layoutSubviews對您的UIControl子類包含的任何意見,並避免隨之而來的UIButton不必要的視圖。實質上,你只是創建你自己的'UIButton',但你可以避免必須解決你並不真正需要或不需要的行爲和功能。