2011-11-29 23 views
22

परिभाषित करने के लिए UIAppearance का उपयोग करना यदि मैं समूहबद्ध UITableViewCell पर पृष्ठभूमि रंग विशेषता सेट करता हूं, तो पृष्ठभूमि रंग सफलतापूर्वक बदल जाता है। महान।आईओएस: कस्टम UITableViewCell रंग

लेकिन मैं अपने सभी UITableViewCells पर पृष्ठभूमि रंग बदलने के लिए यूआईपीपीरेंस का उपयोग करना चाहता हूं, इसलिए मैं इसे एक ही स्थान पर कर सकता हूं और हर जगह एक बदलाव को प्रभावित कर सकता हूं। यहाँ मेरी कोड है:

[[UITableViewCell appearance] setBackgroundColor:[UIColor colorWithRed:30.0/255.0 green:30.0/255.0 blue:30.0/255.0 alpha:1.0]]; 

UITableViewCell लागू करता UIAppearance और UIAppearanceContainer, तो मैं इस काम करेगा सोचा होगा। लेकिन ऐसा नहीं है। मैंने -[UITableViewCell appearanceWhenContainedIn:(Class)] का उपयोग करने का भी प्रयास किया है, और यह भी काम नहीं करता है।

कोई विचार?

उत्तर

41

अद्यतन (2013/7/8) - यह आईओएस के नए संस्करणों में तय किया गया है। हालांकि, यह जानने के लायक है कि आप आईओएस 6 या उससे नीचे लक्षित कर रहे हैं या नहीं।

आप इस के लिए ऐप्पल को दोष दे सकते हैं, और यह वास्तव में उनके लिए बहुत मायने रखता है। तकनीकी रूप से, backgroundColorअनुकूलन प्रॉक्सी के माध्यम से अनुकूलन योग्य नहीं है।

एप्पल के प्रलेखन से:

उपस्थिति अनुकूलन का समर्थन करने के लिए, एक वर्ग UIAppearanceContainer प्रोटोकॉल और प्रासंगिक एक्सेसर तरीकों UI_APPEARANCE_SELECTOR के साथ चिह्नित किया जाना चाहिए के अनुरूप होना चाहिए।

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR; 

तो क्योंकि यह UI_APPEARANCE_SELECTOR टैग हम जानते हैं कि यह UIAppearance साथ काम करता है के साथ चिह्नित है:

अगर हम UIBarButtonItem की तरह एक वर्ग में जाने और tintColor संपत्ति को देखो हम यह देखते हैं।

यहाँ जहां एप्पल विशेष रूप से मतलब हैं: एक UIView में, backgroundColorकोई उपस्थिति चयनकर्ता टैग है, लेकिन अभी भी UIAppearance साथ काम करता है। एप्पल द्वारा प्रदान किए जाने वाले सभी दस्तावेज के अनुसार यह नहीं होना चाहिए, लेकिन फिर भी यह करता है!

यह भ्रामक इंप्रेशन देता है कि यह UIView के सभी उप-वर्गों के लिए काम करेगा, जिसमें UITableView भी शामिल है। इस से पहले आ गया है, in this previous SO answer

तो लब्बोलुआब यह है कि backgroundColorUIAppearance साथ बिल्कुल काम नहीं करना चाहिए है, लेकिन किसी कारण से यह एक UIView पर करता है। UIView सबक्लास पर काम करने की गारंटी नहीं है, और यह UITableView पर बिल्कुल काम नहीं करता है। क्षमा करें मैं आपको अधिक सकारात्मक जवाब नहीं दे सका!

+0

स्पष्टीकरण के लिए धन्यवाद। इस वजह से मैंने शायद दीवार के खिलाफ अपने सिर को घुमाने में कुछ घंटे बिताए होंगे। – matsr

+0

हां, अच्छा जवाब। धन्यवाद! –

+0

यदि यह ऐसा कुछ है जो आपको वास्तव में परेशान करता है (यह मुझे परेशान करता है!), निश्चित रूप से ऐप्पल के साथ एक बग रिपोर्ट दर्ज करें। मुझे नहीं लगता कि यह वास्तव में एक 'बग' है, लेकिन यह निश्चित रूप से एक कमी है। मुझे लगता है कि मैंने उपस्थिति प्रॉक्सी पर एक बार कोड डेमो में ऐप्पल से 'सेटबैकग्राउंड कॉलर' का उपयोग करने वाले किसी व्यक्ति को भी देखा होगा। – lxt

17

आप UITableViewCell का अपना उप-वर्ग बना सकते हैं जो UIAppearance के अनुरूप है और UI_APPEARANCE_SELECTOR के साथ एक कस्टम सेटर चिह्नित करता है। फिर अपने कस्टम सेटर से सुपरलास पर सेल पृष्ठभूमि रंग सेट करें।

अपने UITableView उपवर्ग

@interface CustomCell : UITableViewCell <UIAppearance> 

@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR; 

@implementation CustomCell 

@synthesize backgroundCellColor; 

-(void)setBackgroundCellColor:(UIColor *)backgroundColor 
{ 
    [super setBackgroundColor:backgroundColor]; 
} 

में अपने AppDelegate

[[CustomCell appearance] setBackgroundCellColor:[UIColor redColor]]; 

में मैं इस उदाहरण में एआरसी उपयोग कर रहा हूँ।

+0

उपclassing के बिना भी, आप प्रॉक्सी उपस्थिति कॉल के लिए एक श्रेणी और कस्टम गुणों का उपयोग कर सकते हैं। यह उपयोगी हो सकता है यदि आप उस विषय को थीम बनाना चाहते हैं जहां आप उप-वर्ग का उपयोग नहीं कर सकते (उदाहरण के लिए 'UIPrintInteractionController' के लिए)। – Tom

0

मैंने इसके लिए श्रेणी का उपयोग किया। नीचे नमूना कोड अपने ज फ़ाइल में लिखने

*@interface UITableViewCell (MyCustomCell) 
@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR; 
@end* 

अपने .m फ़ाइल में लिखने

*@dynamic backgroundCellColor; 
-(void)setBackgroundCellColor:(UIColor *)backgroundColor 
{ 
    [super setBackgroundColor:backgroundColor]; 
}* 

यह मेरे लिए अच्छी तरह से काम करता है। :) धन्यवाद नाट !!!

3

सबक्लासिंग के बिना! उप-वर्ग पर ऐसा करना शायद सबसे अच्छा अभ्यास नहीं है, खासकर यदि आप सभी तालिका दृश्य पृष्ठभूमि को हिट करना चाहते हैं। यह बहुत सब्सक्राइबिंग है। बहुत सारी संभावित बग। वास्तव में एक गड़बड़ ऐसा करने का सबसे अच्छा तरीका एक श्रेणी का उपयोग करना है। आपको तालिका ViewCell और tableView दोनों के लिए एक सेट अप करना होगा। मैं सिर्फ सेल के लिए एक प्रदर्शन करेंगे। तालिका पर संपत्ति आपको देखना चाहिए पृष्ठभूमि रंग संपत्ति है। एनबी। मैं अपने तरीकों को "बैठे" के साथ तैयार कर रहा हूं।

// ज

#import <UIKit/UIKit.h> 

@interface UITableViewCell (Appearance)<UIAppearance> 
@property (strong, nonatomic) UIColor *satBackgroundColor UI_APPEARANCE_SELECTOR; 
@end 

// मीटर

#import "UITableViewCell+Appearance.h" 

@implementation UITableViewCell (Appearance) 

- (UIColor *)satBackgroundColor 
{ 
    return self.backgroundColor; 
} 

- (void)setSatBackgroundColor:(UIColor *)satBackgroundColor 
{ 
    self.backgroundColor = satBackgroundColor; 
} 


@end 
अब आप अपने AppDelegate या कुछ प्रबंधक वर्ग आप श्रेणी आयात करेंगे और जैसे कि यह एक स्वरूप था बस यह फोन में

प्रॉक्सी निर्मित

UITableViewCell *cell = [UITableViewCell appearance]; 
cell.satBackgroundColor = [UIColor orangeColor]; 

ठीक है, तो अब तालिका के दृश्य तालिका के लिए केवल एक करें। सरल।

संबंधित मुद्दे