2012-01-18 16 views
5

प्रदर्शित नहीं करता है मुझे नेविगेशन नियंत्रकों के साथ किसी समस्या पर थोड़ी मदद चाहिए।popToRootViewController एनिमेटेड रूट व्यू कंट्रोलर

मेरे पास navigationController है जिसमें 4 ViewControllers धक्का दिया गया है। अंतिम वीसी I पुश एक और ViewController मॉड्यूल प्रस्तुत करता है। मॉडल ViewController एक ActionSheet प्रस्तुत करता है। उपयोगकर्ता के उत्तर के आधार पर मैं या तो मोडल ViewController को केवल खारिज कर देता हूं या मैं रूट ViewController पर वापस जाना चाहता हूं।

ViewController प्रस्तुत में रीति से मेरे पास है:

- (void) dismissGameReport 
{  
    [[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];  
} 

पिछले ViewController में navigationController ढेर मेरे पास है पर धकेल दिया:

- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot; 
{  
    if (popToRoot) 
     { 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
     } 
    else 
     { 
     [self dismissModalViewControllerAnimated:YES]; 
     }    
} 

मोडल दृश्य नियंत्रक ठीक काम करता है खारिज। हालांकि,

[self.navigationController popToRootViewControllerAnimated:NO]; 

अपने विचार प्रदर्शित करने के लिए जड़ ViewController कारण नहीं है। कुछ लॉग जानकारी जोड़कर मैं देखता हूं कि संदेश के बाद self.navigationController पर स्टैक सही ढंग से पॉप किया गया है लेकिन निष्पादन अनुक्रमिक रूप से जारी है। स्क्रीन अभी भी मोडल व्यू कंट्रोलर का दृश्य दिखाती है।

एक कामकाज के रूप में मैंने हमेशा मोडल व्यू कंट्रोलर को खारिज करने की कोशिश की और ViewWillAppear विधि में popToRootAnimated संदेश है। कोई फर्क नहीं। फिर भी नियंत्रकों का ढेर पॉप हो गया है लेकिन स्क्रीन मेरे मोडल व्यू कंट्रोलर के दृश्य को दिखा रही है और निष्पादन अनुक्रमिक रूप से जारी है।

क्या कोई मेरी मदद कर सकता है?

+0

क्या आप ब्रेक पॉइंट के साथ डीबग करने का प्रयास कर रहे हैं कि आपका कंपाइलर लूप में जाता है? – Hiren

उत्तर

6

मुझे इन भ्रामक प्रश्न पसंद हैं। यह बहुत आसान लगता है, जब तक आप इसे करने की कोशिश नहीं करते।

मुझे जो मिला वह मूल रूप से आपको उस मोडल व्यू कंट्रोलर को खारिज करने की आवश्यकता है, लेकिन यदि आप अगली पंक्ति पर नेविगेशन नियंत्रक से पॉप करने का प्रयास करते हैं तो चीजें मिश्रित हो जाती हैं। आपको यह सुनिश्चित करना होगा कि पॉप को आज़माने से पहले खारिज पूरा हो गया हो। आईओएस 5 में आप dismissViewControllerAnimated:completion: का उपयोग कर सकते हैं।

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    if (popToRoot){ 
     [self dismissViewControllerAnimated:YES completion:^{ 
      [self.navigationController popToRootViewControllerAnimated:YES]; 
     }]; 
    } 
    else{ 
     [self dismissModalViewControllerAnimated:YES]; 
    }    
} 

लेकिन मुझे लगता है कि आपके पास अपने प्रश्न टैग में 4.0 है। <iOS 5 के लिए जो समाधान मिला वह बहुत कम सुंदर है लेकिन अभी भी काम करना चाहिए, और ऐसा लगता है जैसे आप पहले से ही निशान पर थे। आप viewDidAppear:viewWillAppear: नहीं चाहते हैं। यहाँ मेरे समाधान एक इवर शामिल है, मान लीजिए कि:

BOOL shouldPopToRootOnAppear; 

और फिर अपने GameReportModalWillBeDismissed: कुछ इस तरह दिखेगा:

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    shouldPopToRootOnAppear = popToRoot; 
    [self dismissModalViewControllerAnimated:YES];   
} 

और अपने viewDidAppear: इस प्रकार दिखाई देगा ...

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if (shouldPopToRootOnAppear){ 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
     return; 
    } 
    // Normal viewDidAppear: stuff here 
} 
+0

हैलो। महान !!! इसने एक जादू की तरह काम किया। बहुत बहुत धन्यवाद, यह 4 दिनों से अधिक था, मैं अपने कोड के साथ चारों ओर झुका रहा था। एक बार फिर धन्यवाद। – DanL

+0

stackoverflow.com में आपका स्वागत है। मदद करने में खुशी। अगर इस उत्तर में आपकी समस्या हल हो गई है तो आपको इसे स्वीकार करना चाहिए। – NJones

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

  • कोई संबंधित समस्या नहीं^_^