2012-05-24 13 views
10

मेरे दृश्य वर्ग में कुछ कस्टम उपस्थिति गुण हैं (UIView के वंशज)। मैं इन गुणों के अनुसार दृश्य स्वरूप को अनुकूलित करना चाहते हैं, लेकिन मैं ऐसा नहीं कर सकते प्रारंभकर्ता अंदर, के बाद से मूल्यों [[MyClass appearance] setFoo:…] का उपयोग कर सेट उस बिंदु पर प्रभाव में नहीं हैं:मैं यूआईपीपीरेंस का उपयोग करके प्रॉपर्टी सेट का उपयोग शुरू कर सकता हूं?

@interface View : UIView 
@property(strong) UIColor *someColor UI_APPEARANCE_SELECTOR; 
@end 

@implementation View 
@synthesize someColor; 

// Somewhere in other code before the initializer is called: 
// [[View appearance] setSomeColor:[UIColor blackColor]]; 

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"%@", someColor); // nil 
    return self; 
} 

@end 

वे पहले से ही में स्थापित कर रहे हैं layoutSubviews, लेकिन दृश्य अनुकूलन करने के लिए यह एक अच्छा बिंदु नहीं है, क्योंकि कुछ अनुकूलन layoutSubviews फिर से ट्रिगर कर सकते हैं, जिससे अंतहीन पाश हो जाता है।

तो, अनुकूलन करने के लिए एक अच्छा बिंदु क्या है? या क्या कोड को ट्रिगर करने का कोई तरीका है जो उपस्थिति मान लागू करता है? अगर यह आपको परेशानी दे रही है

+0

मुझे लगता है कि एक बार कस्टम क्लास आवंटित किया गया है, सदस्य के गुणों को हमेशा आवश्यकता के अनुसार एक्सेस किया जा सकता है और फिर ऑब्जेक्ट को कोड में संशोधित जानकारी के साथ उपयोग किया जा सकता है। –

+1

बस यह सुनिश्चित करने के लिए, मैं उपस्थिति प्रॉक्सी ('UIAppearance') के माध्यम से निर्धारित गुणों के बारे में बात कर रहा हूं। इन मानों को प्रारंभकर्ता के मुकाबले कहीं भी सेट किया गया है। अगर मैं प्रॉपर्टी सेटर पर ब्रेकपॉइंट सेट करता हूं, तो मैं देख सकता हूं कि मान '[कैलियर लेआउट सब्लेयरर्स]' से लागू होते हैं। – zoul

उत्तर

2

एक संभावित समाधान, प्रॉक्सी से सीधे मूल्य हड़पने के लिए है:

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"%@", [[View appearance] someColor); // not nil 
    return self; 
} 

बेशक इस दृश्य कंटेनर के अनुसार उपस्थिति भिन्न करने विकल्प को मारता है और आम तौर पर बदसूरत है। दूसरा विकल्प मैंने पाया सेटर में अनुकूलन प्रदर्शन करने के लिए है:

- (void) setSomeColor: (UIColor*) newColor 
{ 
    someColor = newColor; 
    // do whatever is needed 
} 

फिर भी मैं नहीं बल्कि कुछ हुक के बाद उपस्थिति गुण सेट कर रहे हैं कहा जाता हो जाता है कि होगा।

+0

मेरा जवाब देखें; 'हुक' UIView किया गया है MoveToSuperview :, मुझे विश्वास है। – TomSwift

1

क्यों जब तक

- (void)willMoveToSuperview:(UIView *)newSuperview { 
    [super willMoveToSuperview:newSuperview]; 

    if (newSuperview) { 
     ... code here ... 
    } 
} 

इंतजार नहीं?

+2

यह मेरा अगला प्रयास था, लेकिन मूल्य उस बिंदु पर सेट नहीं हैं। – zoul

0

मैंने सोचा होगा कि दृश्य-डीडलोड सबसे अच्छा होगा यदि यह एक बार की बात है। अन्यथा, ViewWillAppear।

संपादित करें:

आप फिर मैं की तर्ज पर देखने के लिए एक कस्टम init बनाना होगा ध्यान में रखते हुए यह करना चाहते हैं, और न यह नियंत्रक बताया गया है:

-(id) initWithFrame:(CGRect) frame andAppearanceColor:(UIColor)theColor; 

जिससे रंग गुजर निर्माण समय पर विचार में।

+0

ये नियंत्रक विधियां हैं और मैं इसे दृश्य में संभालता हूं।इसके अलावा, यह काफी संभावना है कि इन कॉल के दौरान मूल्य अभी तक सेट नहीं हैं। – zoul

+0

प्रारंभकर्ता में रंग पास करना भी एक विकल्प नहीं है, क्योंकि सेट करने के लिए और अधिक उपस्थिति गुण हैं और प्रारंभकर्ता को नियंत्रक के बाहर एक जगह में कहा जाता है ... erm, * control *। कोई कह सकता है कि उपस्थिति प्रॉक्सी एपीआई का पूरा बिंदु हाथों को हर समय हाथों से सेट करने से छुटकारा पाना था। – zoul

+0

मैं देखता हूं कि आप कहां से आ रहे हैं। हो सकता है कि आप उपस्थिति गुणों को सेट करने के लिए एक विधि बना सकें और एनएसएनोटिफिकेशन के जवाब में इसे कॉल कर सकें (जब उपस्थिति गुण निर्दिष्ट किए जाते हैं)? – ader

0

मेरा मानना ​​है कि UIAppearance गुणों को एक दृश्य पदानुक्रम में जोड़ा जाने पर दृश्य पर लागू किया जाता है। तो संभवतः आप UIView didMoveToSuperview में सेट गुणों तक पहुंच सकते हैं।

1

चेतावनी: मैं स्विफ्ट 2 का उपयोग कर रहा हूं, इसलिए स्विफ्ट/ऑब्जेक्टिव-सी के पुराने संस्करणों के बारे में सुनिश्चित नहीं है। लेकिन मुझे पता चला है कि didMoveToSuperview() काम नहीं करेगा। गुण layoutSubviews() में उपलब्ध हैं, लेकिन ऐसा कुछ भी करने के लिए यह एक अच्छी जगह नहीं है (क्योंकि इसे एक से अधिक बार कहा जा सकता है)। जीवन में इन गुणों तक पहुंचने के लिए सबसे अच्छी जगह मैंने पाया है कि दृश्य के चक्र didMoveToWindow() है।

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

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