2012-11-12 19 views
34

मैं अपने ऐप प्रतिनिधि में एक मोडल व्यू कंट्रोलर बनाने की कोशिश कर रहा हूं (मैंने showLoginView नामक एक फ़ंक्शन बनाया है)। लेकिन जब भी मैं इसे कहते हैं की कोशिश मैं XCode में एक चेतावनी मिलती है:* * पर देखने का प्रयास विंडो पदानुक्रम में नहीं है

Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy! 

यहाँ विधि कोड है:

- (void)showLoginView 
{ 
    PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"]; 
    [self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil]; 
} 

मैं खिड़की पदानुक्रम के दृश्य कैसे जोड़ सकते हैं? या शायद मैं कुछ गलत कर रहा हूँ?

उत्तर

29

आप ऐपडिलेगेट से एक मोडल व्यू कंट्रोलर प्रदर्शित नहीं कर सकते हैं। आपको जो भी दृश्य नियंत्रक वर्तमान में पूर्ण-स्क्रीन प्रदर्शित कर रहा है, उससे एक मॉडल व्यू कंट्रोलर प्रदर्शित करने की आवश्यकता है। दूसरे शब्दों में, आपको उस कोड को अपने रूट व्यू कंट्रोलर में रखना होगा, या जो भी आप मॉडल वीसी को प्रदर्शित करना चाहते हैं ...

इसके अलावा, आप "presentModalViewController" विधि को प्रस्तुत करने के लिए विधि का उपयोग करना चाहेंगे मोडल।

vC.modalPresentationStyle = UIModalPresentationFormSheet; 
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentModalViewController:vC animated:YES]; 
+0

लेकिन rootViewController पल में दिखाया गया है एक नहीं है? मुझे जेनेरिक फ़ंक्शन को कैसे कार्यान्वित करना चाहिए, जब भी उपयोगकर्ता क्रेडेंशियल्स चेक विफल हो जाता है तो यह एक लॉगिन व्यू कंट्रोलर प्रस्तुत कर सकता है? – patryk

+0

क्या आप नेविगेशन नियंत्रक का उपयोग कर रहे हैं? – HackyStack

+5

मैं एक नेविगेशन नियंत्रक का उपयोग करूंगा और फिर आप प्रदर्शित किए गए एक संदर्भ का संदर्भ प्राप्त कर सकते हैं: displayController = [navController topViewController]; फिर आप ऊपर की तरह सामान्य रूप से धक्का दे सकते हैं जहां आप स्वयं को प्रदर्शित नियंत्रक के साथ बदल देंगे। – HackyStack

3

आप NSLog (@ "% @" self.window.rootViewController), और देख सकते हैं कि rootViewController वास्तव में है: आप इस तरह के रूप मोडल कुलपति पर गुण सेट कर सकते हैं।

मैं इस समस्या में आया, जब rootViewController एक सामान्य UIViewController है। इसे एक UINavigationController के साथ बदलें, इच्छा है कि इससे मदद मिलेगी।

19

आप वास्तव में ऐपडिलेगेट से एक मोडल व्यू कंट्रोलर प्रस्तुत कर सकते हैं जब तक आप वर्तमान दृश्य दृश्य नियंत्रक का पता लगाते हैं और उस मामले का ख्याल रखते हैं जहां आप वर्तमान नियंत्रक एक नेविगेशन नियंत्रक है। प्रस्तावित समाधान काम के किसी भी बनाने के लिए महत्वपूर्ण

[self.window makeKeyAndVisible]; 
में

कहते थे -

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) { 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
[activeController presentModalViewController:loginViewController animated:YES]; 
+1

बढ़िया! यह काम करता हैं! – echo

+1

इसके अतिरिक्त आप एक्सचेंज कर सकते हैं: '[सक्रिय नियंत्रक उपस्थित मॉडुअल व्यू कंट्रोलर: loginViewController एनिमेटेड: हाँ] 'to' [सक्रिय नियंत्रक उपस्थित दृश्य नियंत्रक: loginNavigationController एनिमेटेड: कोई समापन नहीं: शून्य]' अगर आप एक नेविगेशन नियंत्रक प्रस्तुत करना चाहते हैं। –

+0

बहुत बढ़िया! धन्यवाद। –

8
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) 
{ 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
else if (activeController.modalViewController) 
{ 
    activeController = activeController.modalViewController; 
} 
[activeController presentModalViewController:vc animated:YES]; 
+0

.modalViewController अब बहिष्कृत है, अब आप सक्रिय कंट्रोलर.presentedViewController – Pach

7

मैं iOS 7 पर इस समस्या का सामना किया:

यहाँ मैं क्या करते हैं आपका AppDelegate। उस कॉल के बाद, विंडो के rootViewController से एक मॉडल दृश्य प्रस्तुत करना काम किया।

+0

का उपयोग कर सकते हैं मैं मैन्युअल रूप से स्टोरीबोर्ड लोड नहीं कर रहा हूं, इसलिए यह था। बहुत - बहुत धन्यवाद। – glasz

4

उस चेतावनी का एक और कारण यह हो सकता है कि आप एक उदाहरण से दृश्य नियंत्रक प्रस्तुत करना चाहते हैं जो शीर्षतम दृश्य नियंत्रक नहीं है।

तो सबसे पहले आप सर्वोच्च UIViewController हो और presentViewController कॉल करने के लिए इस उदाहरण का उपयोग कर के लिए है:

UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController; 
while (root.presentedViewController) { 
    root = root.presentedViewController; 
} 
+1

स्विफ्ट 3 UIApplication.shared.keyWindow? .rootViewController? .present (vc, एनिमेटेड: सत्य, समापन: शून्य) – Jason