2012-05-19 6 views
9

मैं अगर वहाँ अभी भी जड़ दृश्य नियंत्रक से अधिक एक मॉडल दृश्य है की जाँच की जरूरत है। समस्या का सामना करना पड़ रहा हूँ कि मैं एक दूसरे मोडल दृश्य कुछ धागा प्रदर्शित करने के लिए की जरूरत है से आ रही है। मैं दूसरे मोडल व्यू में देरी करना चाहता हूं जब तक कि पहला नहीं चला जाता। पहले इसे खारिज करने के बाद मैं इसे लॉन्च नहीं कर सकता क्योंकि दूसरा मोडल व्यू सशर्त है।मैं कैसे जांच कर सकते हैं एक मॉडल दृश्य मेरी self.window.rootViewController से अधिक वर्तमान में है?

[self.window.rootViewController presentModalViewController:vc animated:YES]; 

मैं (एक बेहतर वैकल्पिक तरीका सुझाने के लिए स्वतंत्र लग रहा है) आपकी क्या अपेक्षाएं हैं:

  1. चेक self.window.rootViewController यदि वर्तमान में शीर्ष पर प्रदर्शित एक मॉडल दृश्य है (या अब भी मोडल दृश्य एनिमेट है)।
  2. उपयोग performSelector:afterDelay:0.1
  3. पर दोबारा जांच करें, और यदि आवश्यक हो, देरी फिर

उत्तर

13

rootViewController.presentedViewController (आईओएस 5.0+ में उपलब्ध) या rootViewController.modalViewController (आईओएस 2.0+ में उपलब्ध) प्राप्त करें और देखें कि यह शून्य है या नहीं।

इसके अलावा, आप नहीं माध्यमिक धागे से दूसरे दृश्य नियंत्रक पेश करने के लिए करना चाहते हैं , सभी यूआई सामान मुख्य थ्रेड पर किया जाना है।

+0

यह ठीक है न? "Dispatch_async (dispatch_get_main_queue(),^{ MedicationReminderViewController * कुलपति = [[MedicationReminderViewController alloc] initWithNibName: @" MedicationReminderViewController "बंडल: शून्य]; [theDelegate.window.rootViewController presentModalViewController: कुलपति एनिमेटेड: हाँ]; });" – Pieter

+0

@Pieter, यह ठीक है, हां, यह कोड मुख्य थ्रेड – tux91

+0

पर निष्पादित किया जाएगा, मुझे लगता है कि rootViewController.modalViewController कोई modalViewController है जो rootViewController के शीर्ष पर सामान्य रूप से प्रदर्शित होता है? – Pieter

0

मैं कुछ करने के लिए थोड़ा और नियतात्मक परीक्षा होगी। दोनों मोडल डिस्प्ले करने के लिए ज़िम्मेदार कोड का एक टुकड़ा रखें और इसे ट्रैक करें जब पहला मोडल प्रकट होता है और गायब हो जाता है ताकि अगर उसे दूसरे को प्रदर्शित करने के लिए एक संदेश प्राप्त होता है, तो यह जानता है कि इसे करना है या सिर्फ "लंबित" " झंडा। जब यह बताया जाता है कि पहला व्यक्ति खारिज कर दिया गया है, तो यह जांच सकता है कि दूसरा लंबित है या नहीं।

1

मैं भी इस तरह की समस्या का सामना करना पड़ा। मैं धक्का से एक मोडल पॉप अप करना चाहता था और इससे पहले कि मैं यह जांचना चाहता था कि कुछ स्क्रीन पहले से ही प्रस्तुत की गई है और यदि हाँ उनको खारिज कर दें और नीचे मेरी स्क्रीन पॉप करें तो कोड है।

// Dismiss all the modals which are currently shown. 
    - (void) dismissAllModalsIfAnyWithCompletion:(void(^)(BOOL success)) completion{ 

      BOOL hiddenByModal = nil != [[UIApplication sharedApplication].keyWindow.rootViewController presentedViewController]; 
     if (hiddenByModal) { 
//We need to dismiss the existing modal and after completion pop up the new modal. 
      [[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:NO completion:^{ 
       // After dismissing let the handler know. 
       completion(YES); 
      }]; 
     } 
     else{ 
// If there is no modal, then simply let the handler know to pop the new modal. 
      completion(YES); 
     } 
    } 
+1

अच्छा सुरुचिपूर्ण समाधान। (हालांकि बुल फ्लैग थोड़ा अधिक जटिल लगता है। क्यों न केवल 'अगर ([[यूआईपीप्लिकेशन साझा अनुप्रयोग] .keyWindow.rootViewController प्रस्तुत दृश्य नियंत्रक]) '?) –