2010-04-27 19 views
8

मैं awakeFromNibजागने में देखने के लिए FromNib?

[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]]; 

में एक UIImageView पृष्ठभूमि रंग (देखें नीचे) स्थापित करने के लिए जब यह काम नहीं किया कोशिश कर रहे हैं, मुझे एहसास हुआ है कि इसकी शायद इसलिए है क्योंकि दृश्य अभी तक लोड नहीं किया है और मैं रंग बदलने के लिए आगे बढ़ना चाहिए डिडलोड देखने के लिए।

क्या मैं सिर्फ यह सत्यापित कर सकता हूं कि मेरे पास यह अधिकार है?

गैरी

EDIT_002:

मैं सिर्फ एक साफ शुरू से ही इस जांच करने के लिए एक नए सिरे से परियोजना शुरू कर दिया है। मैं वही दृश्य करता हूं जैसा मैं हमेशा करता हूं। नतीजे ये हैं कि नियंत्रण वास्तव में जागृत (Null) में जागृत हैं। यहाँ मैं क्या है:

कोड:

@interface iPhone_TEST_AwakeFromNibViewController : UIViewController { 
    UILabel *myLabel; 
    UIImageView *myView; 
} 
@property(nonatomic, retain)IBOutlet UILabel *myLabel; 
@property(nonatomic, retain)IBOutlet UIImageView *myView; 
@end 

@synthesize myLabel; 
@synthesize myView; 

-(void)awakeFromNib { 
    NSLog(@"awakeFromNib ..."); 
    NSLog(@"myLabel: %@", [myLabel class]); 
    NSLog(@"myView : %@", [myView class]); 
    //[myLabel setText:@"AWAKE"]; 
    [super awakeFromNib]; 

} 

-(void)viewDidLoad { 
    NSLog(@"viewDidLoad ..."); 
    NSLog(@"myLabel: %@", [myLabel class]); 
    NSLog(@"myView : %@", [myView class]); 
    //[myLabel setText:@"VIEW"]; 
    [super viewDidLoad]; 
} 

उत्पादन:

awakeFromNib ... 
myLabel: (null) 
myView : (null) 
viewDidLoad ... 
myLabel: UILabel 
myLabel: UIImageView 

मैं, जानना चाहते हैं कि यह काम करना चाहिए रुचि होगी डॉक्स यह लग रहा है से है जैसे कि यह होना चाहिए, लेकिन जिस तरह से मैं आमतौर पर बातें की स्थापना की मैं काफी नहीं कर सकते दी समझें कि यह इस मामले में क्यों नहीं है।

उत्तर

27

एक और उत्तर :-) ऐसा लगता है कि आपको यह व्यवहार मिल रहा है क्योंकि नियंत्रक दृश्यों को आलसी लोड करता है। दृश्य तुरंत लोड नहीं होता है, यह पहली बार लोड हो जाता है जब कोई view एक्सेसर को कॉल करता है। इसलिए जब आप awakeFromNib प्राप्त करते हैं तो एनआईबी लोडिंग प्रक्रिया पूरी की जाती है, लेकिन आपके विचारों के अंदर वस्तुओं के लिए नहीं है।

@property(retain) IBOutlet UILabel *foo; 
@synthesize foo; 

- (void) awakeFromNib 
{ 
    NSLog(@"#1: %i", !!foo); 
    [super awakeFromNib]; 
    NSLog(@"#2: %i", !!foo); 
} 

- (void) viewDidLoad 
{ 
    NSLog(@"#3: %i", !!foo); 
} 

यह लॉग:

#1: 0 
#2: 0 
#3: 1 

लेकिन दृश्य यदि आप के लिए मजबूर लोड:

- (void) awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self view]; // forces view load 
    NSLog(@"#1: %i", !!foo); 
} 

इस में लॉग परिवर्तन:

#3: 1 
#1: 1 
+0

धन्यवाद जूल, यह बहुत दिलचस्प है। मुझे लगता है कि मैं व्यूडिडलोड का उपयोग करके बस बेहतर हूं क्योंकि दृश्य को पहले लोड करने के लिए दृश्य को मजबूर करना।मैंने यह भी पढ़ा था कि जागरूकता का उपयोग करना आईफोन पर अच्छा विचार नहीं हो सकता है, लेकिन उस पर मिश्रित राय दिखाई देती है। धन्यवाद फिर से ... – fuzzygoat

+0

यदि आपके पास दृश्य तक पहुंच नहीं है, तो एक प्रदर्शन चयनकर्ता करें: ऑब्जेक्ट: जागने से कॉल कॉल करें FromNib। एक हैक, लेकिन प्रभावी। – phatmann

+0

बस इस प्रश्न के दौरान ठोकर खाई और पहली बार जवाब दिया - अगर मुझे इससे पहले मिल गया तो यह मुझे परेशानी का एक गुच्छा बचा लेगा! यह मुद्दा 2013 में अभी भी मौजूद है, और मेरा मानना ​​है कि व्यवहार दस्तावेज के विपरीत है - यहां देखें: http://stackoverflow.com/questions/17400547/awakefromnib-outlets-and-storyboards-is-the-documentation-wrong –

-1

क्या आप वाकई nil नहीं हैं? NSAssert या NSParameterAssert अपने मित्रों को कर रहे हैं:

-(void) awakeFromNib { 
    NSParameterAssert(imageView); 
    NSParameterAssert(testLabel); 
    NSLog(@"awakeFromNib ..."); 
    [imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]]; 
    [testLabel setText:@"Pants ..."]; 
    [super awakeFromNib]; 
} 

वस्तुओं वास्तव में प्रारंभ रहे हैं, तो उनका पता लॉग इन करें और awakeFromNib में यह सुनिश्चित करें कि इंस्टेंस viewDidLoad में दिखाई देते हैं उन के रूप में ही कर रहे हैं बनाने की कोशिश:

- (void) awakeFromNib { 
    NSLog(@"test label #1: %@", testLabel); 
} 

- (void) viewDidLoad { 
    NSLog(@"test label #2: %@", testLabel); 
} 

यदि संख्याएं समान हैं, तो आप setBackgroundColor पर ब्रेकपॉइंट सेट करने के लिए एक श्रेणी बना सकते हैं और यह देखने के लिए स्टैक ट्रेस में देख सकते हैं कि क्या हो रहा है:

@implementation UIImageView (Patch) 
- (void) setBackgroundColor: (UIColor*) whatever { 
    NSLog(@"Set a breakpoint here."); 
} 
@end 

आप एक कस्टम उपवर्ग का उपयोग कर एक ही चाल कर सकते हैं:

@interface PeekingView : UIImageView {} 
@end 

@implementation PeekingView 
- (void) setBackgroundColor: (UIColor*) whatever { 
    NSLog(@"Set a breakpoint here."); 
    [super setBackgroundColor:whatever]; 
} 
@end 

अब आप सेट करेंगे अपने UIViewObject इंटरफ़ेस बिल्डर में वर्ग PeekingView का होना और आपको पता चल जाएगा किसी को भी पृष्ठभूमि सेट करने के लिए कोशिश करता है। awakeFromNib में दृश्य आरंभ करने के बाद यह उस मामले को पकड़ लेगा जहां कोई पृष्ठभूमि परिवर्तन को ओवरराइट करता है।

लेकिन मुझे लगता है कि समस्या अधिक सरल होगी, यानी। imageView सबसे अधिक nil है।

+0

हाय Zoul, बहुत सराहना, मैं अपने सुझाव के माध्यम से पहली बात सुबह में जाने के लिए और करने देगा आप जानते हैं कि मैं कैसे चल रहा हूं। शायद यह कुछ आसान होने के बारे में सही है, मुझे बेहतर दिखने दें। – fuzzygoat

+0

हाय ज़ोल, नियंत्रण वास्तव में शून्य थे, (ऊपर संपादित करें_002 देखें) – fuzzygoat

1

मेरा मानना ​​है कि सुपर को आपकी कॉल को जागने की आवश्यकता है, FakeNib विधि में पहली पंक्ति है, अन्यथा तत्व अभी तक सेटअप नहीं किए जाएंगे।

-(void)awakeFromNib { 
    [super awakeFromNib]; 
    [imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]]; 
    [testLabel setText:@"Pants ..."]; 
} 
+2

यह एक अच्छा अनुमान है और 'सुपर' को वास्तव में पहले कहा जाना चाहिए, लेकिन यह इस मामले में मदद नहीं करता है। – zoul

0

इस कोड देखें मुझे पता है, यह पोस्ट थोड़ा बड़ा है, लेकिन मैंने हाल ही में किया था एक समान समस्या है और आप इसके साथ अपना समाधान साझा करना चाहते हैं।

एनएसटीएक्स्टव्यू उप-वर्गीकृत होने के बाद, मैं वैकल्पिक ऑर्डर में पंक्ति रंग प्रदर्शित करना चाहता था। बाहर से रंग बदलने के लिए सक्षम होने के लिए, मैं जोड़ा दो उदाहरण मेरी उपवर्ग को वार्स, XNSStripedTableView:

@interface XNSStripedTableView : NSTableView { 

    NSColor *pColor; // primary color 
    NSColor *sColor; // secondary color 
} 

@property (nonatomic, assign) NSColor *pColor; 
@property (nonatomic, assign) NSColor *sColor; 

@end 

Overwriting highlightSelectionInClipRect: चाल संबंधित clipRect के लिए सही रंग सेट करने देता है।

- (void)highlightSelectionInClipRect:(NSRect)clipRect 

{

float rowHeight = [self rowHeight] + [self intercellSpacing].height; 
NSRect visibleRect = [self visibleRect]; 
NSRect highlightRect; 

highlightRect.origin = NSMakePoint(NSMinX(visibleRect), (int)(NSMinY(clipRect)/rowHeight)*rowHeight); 
highlightRect.size = NSMakeSize(NSWidth(visibleRect), rowHeight - [self intercellSpacing].height); 

while (NSMinY(highlightRect) < NSMaxY(clipRect)) { 

    NSRect clippedHighlightRect = NSIntersectionRect(highlightRect, clipRect); 
    int row = (int) ((NSMinY(highlightRect)+rowHeight/2.0)/rowHeight); 
    NSColor *rowColor = (0 == row % 2) ? sColor : pColor; 
    [rowColor set]; 
    NSRectFill(clippedHighlightRect); 
    highlightRect.origin.y += rowHeight; 
} 

[super highlightSelectionInClipRect: clipRect]; 

}

केवल समस्या अब है, जहां pColor और sColor के लिए प्रारंभिक मान सेट करने के? मैंने जागने की कोशिश की FromNib :, लेकिन यह डीबगर एक त्रुटि के साथ आने का कारण होगा। इसलिए मैंने NSLog के साथ समस्या में खोला: और एक आसान लेकिन व्यवहार्य समाधान मिला: व्यूविल्लड्रा: में शुरुआती मान सेट करना। चूंकि वस्तुओं को पहली बार विधि को कॉल नहीं किया गया है, इसलिए मुझे शून्य की जांच करनी पड़ी।

- (void)viewWillDraw { 

if (pColor == nil) 
    pColor = [[NSColor colorWithSRGBRed:0.33 green:0.33 blue:0 alpha:1] retain]; 

if (sColor == nil) 
    sColor = [[NSColor colorWithSRGBRed:0.66 green:0.66 blue:0 alpha:1] retain]; 

}

मुझे लगता है कि इस समाधान अधिक "मानव पठनीय" होने के लिए समायोजित किया जा सकता काफी अच्छा :-) हालांकि एक pColor और sColor के नाम फिर से चुनें सकता है।

-1

मामले में आप एक UIViewController उपवर्ग के बजाय एक UIView उपवर्ग का उपयोग कर रहे हैं, तो आप loadView विधि ओवरराइड कर सकते हैं:

- (void)loadView 
{ 
    [super loadView]; 
    //IBOutlets are not nil here. 
} 
संबंधित मुद्दे