2011-02-01 12 views
7

मुझे अजीब त्रुटि है, और मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। यहां कोड है जब मैं व्यू कंट्रोलर बनाता हूं और इसे नेविगेशन नियंत्रक पर दबाता हूं। समस्या यादृच्छिक चर को नए दृश्य नियंत्रक को पास कर रही है। मैंने इसे init विधि में पास करने की कोशिश की और इसे नीचे टिप्पणी की लाइन के साथ पास कर दिया।ViewDidLoad initWithNibName से पहले बुलाया जा रहा है?

MultipleBet *multipleBet = [[MultipleBet alloc] initWithMaxNumber:numbers andMaxStars:stars andRandom:self.random]; 
    NSLog(@"RANDOM1: %d", self.random); 
    //[multipleBet setRandom:self.random]; 

    UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] init] autorelease]; 
    backButton.title = @"Voltar"; 
    self.navigationItem.backBarButtonItem = backButton; 
    [self.navigationController pushViewController:multipleBet animated:YES]; 

    [multipleBet release]; 

हालांकि जब मैं MultipleBet की viewDidLoad में यादृच्छिक चर का उपयोग, यह हमेशा गलत है।

यहाँ MultipleBet का कोड है:

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom { 
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]]; 
    ... 

    self.random = isRandom; 
    NSLog(@"RANDOM2: %d", self.random); 
    NSLog(@"RANDOM2.1: %d", isRandom); 

return self; 
} 

और यहाँ viewDidLoad का कोड है:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    NSLog(@"RANDOM2.2: %d", self.random); 

} 

मैं इस तरह चर और संपत्ति की घोषणा:

BOOL random; 
@property (nonatomic) BOOL random; 

और आउटपुट हमेशा होता है:
RANDOM2.2: 0
RANDOM2: 1
RANDOM2.1: 1
RANDOM1: 1

क्यों viewDidLoad से NSLog सभी दूसरों से पहले outputted जा रहा है? यह आखिरी होना चाहिए ... क्या यह मेरी कस्टम इनिट विधि के कारण हो सकता है? मैं [सुपर इनिट] कहता हूं, इसलिए यह कोई समस्या नहीं होनी चाहिए ...

उत्तर

20

viewDidLoad और init* विधियों को एक के बाद एक निष्पादित करने की गारंटी नहीं है। आपके init* विधियों में कोड दृश्य को लोड करने का कारण बन सकता है, इसलिए viewDidLoad को कॉल किया जाएगा भले ही init* विधि समाप्त नहीं हुई हो।

सबसे अधिक संभावना है कि आपके द्वारा छोड़े गए हिस्से में कुछ कोड दृश्य को लोड कर रहा है। यदि आप हमें वह हिस्सा दिखाएंगे, तो शायद हम इसे इंगित कर सकते हैं। या, आप self.random = isRandom; लाइन को अपने if (self) ब्लॉक के अंदर पहली पंक्ति के रूप में भी ले जा सकते हैं और देख सकते हैं कि यह काम करता है या नहीं। इस तरह, जो कुछ भी लोड करने का कारण बन रहा है उसे self.random असाइन करने के बाद निष्पादित किया जाएगा।

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom { 
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]]; 
    if (self) { 
     // do this first 
     self.random = isRandom; 
     NSLog(@"RANDOM2: %d", self.random); 
     NSLog(@"RANDOM2.1: %d", isRandom); 

     // do the other code after 
     ... 
    } 

    return self; 
} 
+1

हाँ, यह था :) init विधि में मैं [self.view addSubview: कुछ] को बुला रहा था और वह दृश्य को कॉल कर रहा था ... मैंने स्वयं को बदल दिया है। यादृच्छिक = विधि की शुरुआत के लिए यादृच्छिक है और यह मेरी समस्या हल हो गई ... मैंने सोचा था कि व्यूडिडलोड को हमेशा init के बाद बुलाया गया था;) – ffleandro

+0

मैं हमेशा इस तरह की समस्याओं को पाने से बचने के लिए विधि की शुरुआत में * इनिट * को आवंटित करने वाले चर निर्दिष्ट करने के लिए एक बिंदु बना देता हूं। यह समस्या हल करता है, है ना? बाईं ओर स्थित चेक मार्क पर क्लिक करके उत्तर को स्वीकार के रूप में चिह्नित करें। धन्यवाद!:) – Altealice

+1

यह मुझे लंबे समय के बाद बचाया! मैं 'CGRectGetWidth ([self.view सीमाएं] 'के साथ अपने सबव्यूव में से एक में प्रवेश कर रहा था' धन्यवाद !! – minovsky

0

शायद आपके द्वारा छोड़े गए हिस्से में (...) आप दृश्य को किसी भी तरह से लोड कर रहे हैं। यानी, प्रारंभकर्ता में एक सेटर को कॉल करने से आप एक [self.tableView reloadData] या कुछ कर सकते हैं।

1

मैं इस समस्या में फंस गया। मैं चयनकर्ता में स्वयं के साथ एक विधि या संपत्ति बुला रहा था, उदा। init * विधि के भीतर से self.bannerView.frame या [self createBannerView]। जाहिर है, स्वयं उस बिंदु पर प्रारंभिकता पूर्ण नहीं हुआ है, इसलिए स्पष्ट रूप से ऐप्पल में कुछ कोड है जो गुणों या विधियों तक पहुंचने से पहले ViewDidLoad को कॉल करेगा। मेरा समाधान कॉल को इनिट से बाहर ले जाना था और उन्हें डीडलोड में देखा गया था।

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