2014-05-05 6 views
5

पर कॉल करना प्रतीत होता है मैं एक व्यू कंट्रोलर को प्रोग्रामेटिक रूप से नेविगेशन नियंत्रक में धक्का देने की कोशिश कर रहा हूं, और मैं इसे बनाने के लिए अपने स्टोरीबोर्ड का उपयोग कर रहा हूं।instantiateViewControllerWithIdentifier को viewdidload

+ (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender { 
    GenericViewController *viewController = (GenericViewController *)[sender.storyboard instantiateViewControllerWithIdentifier:identifier]; 

    viewController.items = [[NSMutableArray alloc] init]; 
    [viewController.items removeAllObjects]; 
    [viewController.items addObject:[[NSMutableArray alloc] init]]; 
    [viewController.items[0] addObjectsFromArray:items]; 

    [sender.navigationController pushViewController:viewController animated:YES]; 
} 

GenericViewController viewDidLoad में मैं अपने items उपयोग कर रहा हूँ:

यहाँ मेरी कोड है। कुछ ब्रेक पॉइंट्स के लिए धन्यवाद मैंने देखा है कि GenericViewController viewDidLoadinstantiateViewControllerWithIdentifier के बाद items शून्य के बराबर है।

मैंने सोचा कि MyViewController viewDidLoadpushViewController विधि के दौरान कहा जाता है।

कोई विचार क्यों viewDidLoadinstantiateViewControllerWithIdentifier के दौरान कहा जाता है?

--- अद्यतन: ---

यहाँ मेरी viewDidLoad

- (void)viewDidLoad 
{ 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 

    [super viewDidLoad]; 


    [...] 
} 

self.items नहीं के बराबर है। तो कुछ भी नहीं किया जाता है।

+0

डाल पूरा कोड please..what myItem और viewDidLoad method..the समस्या this..cause नहीं है जब आप एक वस्तु आरंभ किया है, यह जिंदा है। –

+0

आपको अधिक जानकारी प्रदान करने की आवश्यकता है।पूरी विधि दिखाएं जहां आप तत्काल ViewControllerWithIdentifier का उपयोग करते हैं:। विधि, instantiateViewControllerWithIdentifier :, viewDidLoad को कॉल नहीं किया जाएगा, इसलिए कुछ और चल रहा है। – rdelmar

+0

धन्यवाद @rdelmar मुझे पूरा यकीन है कि 'instantiateViewControllerWithIdentifier'' viewDidLoad' को कॉल न करें। मैं अपना कोड अपडेट करता हूं, मैं अपने नए व्यू को नियंत्रित करने और धक्का देने के लिए एक स्थिर प्रबंधक का उपयोग कर रहा हूं नियंत्रक –

उत्तर

1

देखें: जब नियंत्रक के दृश्य स्मृति में लोड किया जाता https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

viewDidLoad कहा जाता है।

viewWillAppear दृश्य नियंत्रक को सूचित करता है कि इसका दृश्य दृश्य पदानुक्रम में जोड़ा जा रहा है। मुझे लगता है कि यह तब होता है जब [self.navigationController pushViewController:viewController animated:YES]; कहा जाता है।

viewDidAppear दृश्य नियंत्रक को सूचित करता है कि इसका दृश्य दृश्य पदानुक्रम में जोड़ा गया था। यह तब होता है जब MyViewControllernavigationController में जोड़ा गया है।

+0

यह समझ में आता है, लेकिन इसलिए SO प्रश्न इंगित करते हैं कि यह दृश्य नियंत्रक को गुणों को पारित करने का एक अच्छा तरीका है। (http://stackoverflow.com/a/9666389/1436861, http://stackoverflow.com/a/12709167/1436861) –

0

voyage11 उल्लेख किया है, जब नियंत्रक के दृश्य स्मृति में लोड किया जाता viewDidLoad कहा जाता है, हालांकि किसी ने कहा है कि इस जरूरी instantiateViewControllerWithIdentifier विधि के दौरान नहीं होती है।

अपने उदाहरण कोड के बाद, मैं viewWillAppear विधि में पाश डाल चाहते हैं:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // good practice to call the super 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 
} 
+0

आप प्रारंभिक कथन गलत है - ViewDidLoad को केवल व्यू कंट्रोलर को तुरंत चालू नहीं किया जाएगा। – rdelmar

+0

अच्छा बिंदु। मैंने उस निहितार्थ को हटाने के लिए अपना जवाब अपडेट कर लिया है। –

4

किसी को भी है कि अभी भी एक ही समस्या हो सकता है करने के लिए।

मेरे पास एक समान स्थिति थी और इसे लोडव्यूआईफनीड() को कॉल करके हल किया गया।

let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController 
controller.loadViewIfNeeded() 

मैं तो दृश्य के अंदर सब कुछ का उपयोग कर सकते हैं।

+0

प्रलेखन के अनुसार, loadView() को सीधे कभी नहीं कहा जाना चाहिए। https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview – Ramiro

0

आप उपयोग करने के लिए कोशिश कर सकते हैं "[आत्म loadViewIfNeeded]" के लिए Obj सी या "self.loadViewIfNeeded()" तेज के लिए ; 'स्वयं' = अपने ViewController

apple: loadViewIfNeeded

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