"अनुप्रयोग ने एक सक्रिय नियंत्रक को पेश करने की कोशिश की"?


100

मैं एक दुर्घटना में NSInvalidArgumentExceptionएक ऐप पर इस संदेश के साथ दिखा रहा था जो पहले ऐसा नहीं कर रहा था।

एप्लिकेशन को एक सक्रिय नियंत्रक UITabBarController: 0x83d7f00 पेश करने की कोशिश की।

मेरे पास एक है UITabBarControllerजो मैं इसमें बनाता हूं AppDelegateऔर इसे सरणी देता हूं UIViewControllers

उनमें से एक को मैं उस पर टैप करते समय औपचारिक रूप से प्रस्तुत करना चाहता हूं। मैंने वह प्रतिनिधि पद्धति लागू करके किया

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

यदि वह दृश्य नियंत्रक उस वर्ग का है जिसे मैं सामान्य रूप से प्रस्तुत करना चाहता हूं, तो मैं NO और करता हूं

[tabBarController presentModalViewController:viewController animated:YES];

और अब मुझे वह त्रुटि मिल रही है, जिसका अर्थ है कि आप सामान्य रूप से एक दृश्य नियंत्रक को प्रस्तुत नहीं कर सकते हैं जो कहीं और (टैब्बर में) सक्रिय है ... मुझे कहना चाहिए कि मैं एक्सकोड 4.2 डेवलपर पूर्वावलोकन 7 पर हूं, इसलिए यह आईओएस 5 है (मैं एनडीए के बारे में जानता हूं, लेकिन मुझे लगता है कि मैं कोई मना विवरण नहीं दे रहा हूं)। वर्तमान में मेरे पास यह जांचने के लिए XCode इंस्टॉलेशन नहीं है कि क्या यह iOS4 SDK के खिलाफ क्रैश करता है, लेकिन मुझे लगभग पूरी तरह से यकीन है कि यह नहीं है।

मैं केवल यह पूछना चाहता था कि क्या किसी ने इस मुद्दे का अनुभव किया है या कोई सुझाव है


IOS 5 से पहले, यह एक अपवाद नहीं बढ़ा, लेकिन कुछ भी नहीं लौटाया। IOS 5 से, यह कमांड एक अपवाद उठाती है।
Frédéric Adda

जवाबों:


103

मान लें कि आपके पास तीन दृश्य नियंत्रक हैं जैसे कि तत्काल:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

आपने उन्हें इस तरह एक टैब बार में जोड़ा है:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

अब आप कुछ ऐसा करने की कोशिश कर रहे हैं:

[tabBarController presentModalViewController:vc3];

यह आपको एक त्रुटि देगा क्योंकि टैब बार नियंत्रक की उस दृश्य नियंत्रक पर मृत्यु पकड़ है जो आपने दिया था। आप इसे टैब बार पर व्यू कंट्रोलर्स की सरणी में जोड़ नहीं सकते हैं, या आप इसे औपचारिक रूप से प्रस्तुत नहीं कर सकते हैं।

Apple को उम्मीद है कि आप एक निश्चित तरीके से उनके UI तत्वों का इलाज करेंगे। यह शायद मानव इंटरफ़ेस दिशानिर्देशों में कहीं दफन है "ऐसा मत करो क्योंकि हम उम्मीद नहीं कर रहे हैं कि आप कभी भी ऐसा करना चाहते हैं"।


6
बात यह है कि आईओएस 5 से पहले यह बिल्कुल कोई समस्या नहीं थी, इसलिए मेरी चिंता! मैंने जो भी किया वह एक डमी UIViewController को टैब्बर में जोड़ने और वर्तमान में वास्तविक दृश्य नियंत्रक उपवर्ग उदाहरण पेश करने के लिए था।
जेवियर सोतो

1
@ Iswank, अब iOS 6 में, चीजों को "आसान" बनाने के लिए, उन्होंने presentModalViewController को दर्शाया है जो सभी प्रकार की घूर्णी समस्याओं का कारण बनता है ... आपको presentViewController का उपयोग करने की आवश्यकता है: एनिमेटेड: पूरा होने और जांचें कि आपका ऐप परिवर्तनों को कैसे संभाल रहा है
Whyoz

15

मेरी भी यही समस्या है। मैं खारिज करने के बाद ही दृश्य नियंत्रक पेश करने की कोशिश करता हूं।

[self dismissModalViewControllerAnimated:YES];

जब मैं इसे एनीमेशन के बिना करने की कोशिश करता हूं तो यह पूरी तरह से काम करता है इसलिए समस्या यह है कि नियंत्रक अभी भी जीवित है। मुझे लगता है कि सबसे अच्छा समाधान dismissViewControllerAnimated:completion:iOS5 के लिए उपयोग करना है


यदि आप इसे एनिमेटेड रूप से खारिज कर देते हैं तो यह विफल हो जाता है क्योंकि जब तक आप मोडल व्यू कंट्रोलर को फिर से प्रस्तुत करना चाहते हैं, तब तक यह स्क्रीन पर सामान्य रूप से एनिमेटेड रहता है।
पास्कल

2
इसे IOS 6.0 में
सुमित किया गया है

12

मेरे मामले में मैं अलग-अलग दृश्य नियंत्रकों से व्यूकंट्रोलर (i TabCarViewController में viewController का संदर्भ) प्रस्तुत करने की कोशिश कर रहा था और यह उपरोक्त संदेश के साथ क्रैश हो रहा था। उस स्थिति में आप प्रस्तुत करने से बच सकते हैं

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

किसी की मदद कर सकते हैं।


यह केवल व्यूप्लेपर में काम कर रहा है, लेकिन जब मैंने व्यूकार्ट्रोलर को प्रस्तुत करने से पहले इसकी जांच की है जो पहले से ही प्रस्तुत है, तो यह हमेशा गलत है।
गुरु

1
मेरे लिए काम नहीं कर रहा है। फिर भी ऐप क्रैश हो जाता है। (! viewController.pretingViewController) समस्या का समाधान किया।
अर्गस

3

मुझे एक ही समस्या थी। मैं इसे हल करता हूं। आप इस कोड को आज़मा सकते हैं:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

2

मेरे साथ एक ही समस्या त्रुटि तब हुई जब मैंने presentउसके UINavigationViewControllerमाता-पिता के बजाय एक बच्चे को देखने की कोशिश की


0

जरा हटाओ

[tabBarController presentModalViewController:viewController animated:YES];

और रखना

[self dismissModalViewControllerAnimated:YES];

यह पदावनत चेतावनी देता है ... तो इसका वैकल्पिक क्या है?
कीर्तिकुमार ए।

यहाँ मैंने [blockSelf बर्खास्त ViewControllerAnimated: YES पूरा: nil] का इस्तेमाल किया;
कीर्तिकुमार ए।

0

के बजाय का उपयोग करने का:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

आप उपयोग कर सकते हैं:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)

0

मेरे मामले में, मैं पेश किया गया था rootViewControllerएक की UINavigationControllerजब मैं पेश करने के लिए चाहिए था UINavigationControllerही।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.