我看過多次,我們不應該繼承的組件(一個UIButton例如)範疇:子類VS與Interface Builder的
問題是,當我使用Interface Builder。 例如,我在很多視圖中都有一個精確外觀的按鈕。我可以每次使用IB設置它們(這很痛苦),或者我可以使用自定義類來分解自定義行爲和外觀。
對我來說,簡化IB程序的唯一方法就是按照每個人都建議的方式來做,這似乎有點矛盾。
有沒有更好的解決方案?我可以使用IB的類別嗎?
謝謝。
我看過多次,我們不應該繼承的組件(一個UIButton例如)範疇:子類VS與Interface Builder的
問題是,當我使用Interface Builder。 例如,我在很多視圖中都有一個精確外觀的按鈕。我可以每次使用IB設置它們(這很痛苦),或者我可以使用自定義類來分解自定義行爲和外觀。
對我來說,簡化IB程序的唯一方法就是按照每個人都建議的方式來做,這似乎有點矛盾。
有沒有更好的解決方案?我可以使用IB的類別嗎?
謝謝。
你提供的第二個鏈接非常清晰,這幾乎是蘋果自己說的,子類,但從來沒有弄亂內部結構。
最好的例子是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;
}
你也可以做到這一點init
或awakeFromNib
沒有問題(我通常更喜歡後者)。
UIAppearence
也是一個選項,正如用戶hw731所建議的那樣。無論怎樣漂浮你的船,真的。
至於第二個問題,筆尖文件非常創建實例類,然後填寫在IT賣場加載時使用setValue:forKey:
的東西(這就是爲什麼你得到一個錯誤「類不是鍵值兼容的東西」當你擰上一個筆尖時),所以如果在筆尖加載時對某物進行分類,那麼是的,筆尖尊重類別,因爲它只是使用initWithCoder
..然後填補空白。
同樣,由於不知道它們,因此nib文件將無法填充自定義屬性,除非您明確將它們添加到IB的「用戶定義的運行屬性」中(iOS 5以上)。
爲碎粒的另一種技術,是使用
@property (strong) IBOutletCollection(UIButton) NSArray *buttons;
然後迭代,並相應地自定義按鈕(經由一個子類,類別,本地方法,...是它)。如果您只需要少量自定義按鈕,但該方法不足以保證使用子類,則此方法非常有用。
您可能可以使用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
}
我看不出有任何理由,你不應該不要繼承UIButton,特別是爲了使您的IB更易於配置。您提供的任何鏈接都不能解釋爲什麼您不應該繼承,所以他們的斷言看起來並不可靠。另一方面,UIButton.h中存在UIButtonTypeCustom
給人的印象是框架作者計劃使用UIButton子類。
不完美,但我會做。 –