2013-12-12 5 views
10

से स्टोरीबोर्ड के साथ प्रोग्राम के रूप में एक दृश्य नियंत्रक instantiating मैं एक एप्लिकेशन बनाने व्यस्त हूँ - यह है कि जब पहली बार लॉन्च किए यह दो काम करने उपयोगकर्ता पूछते हैं:AppDelegate

  1. का चयन करें एक देश
  2. स्वीकार टी & सीएस

वहां से यह घर दृश्य नियंत्रक के पास जाता है।

जिस समस्या का मैं वर्तमान में सामना कर रहा हूं वह मेरे ऐप प्रतिनिधि से स्क्रीन पर पहला व्यू कंट्रोलर दबा रहा है। मैं स्टोरीबोर्ड उपयोग कर रहा हूँ/Xcode 5/iOS7

यहाँ कोड मैं के साथ आया है:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil]; 
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
[navigationController pushViewController:controller animated:NO]; 

समस्या ऐप्लिकेशन क्रैश होता है जब वह निम्न त्रुटि के साथ कोड की अंतिम पंक्ति हिट:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController pushViewController:animated:]: unrecognized selector sent to instance 0x8e9a400'

किसी के पास कोई विचार है कि मैं क्या गलत कर रहा हूं?

उत्तर

11

आप self.window.rootViewControllerUINavigationController होने की उम्मीद कर रहे हैं लेकिन यह UIViewController है। इसका मतलब है कि आपके स्टोरीबोर्ड में बाहरीतम दृश्य नियंत्रक गलत प्रकार का है।

UINavigationController (जो इस मामले में काम करना चाहिए) प्राप्त करने का एक बेहतर तरीका किसी भी UIViewController पर संपत्ति self.navigationController का उपयोग करना है।

जो मैं समझता हूं उससे आप पहली बार एक दृश्य प्रस्तुत करना चाहते हैं जब उपयोगकर्ता उपयोगकर्ता को कुछ सामान चुनने के लिए चलाता है।

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//isFirstRun is some boolean you use to determine if it's the first run 
if(isFirstRun){ 
    BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
    [self.window.rootViewController presentViewController: controller animated:YES completion:nil]; 
} 
+0

मुझे लगता है कि मैं इस दृष्टिकोण को गलत तरीके से ले रहा हूं। इस दृश्य नियंत्रक को कहीं और नेविगेट करने की आवश्यकता नहीं है। बस खारिज करने की जरूरत है। बाकी ऐप एक टैब बार आधारित ऐप है। ऐप प्रतिनिधि में self.navigationController मौजूद नहीं है? – Tander

+0

मैं अपने उत्तर को एक नई टिप के साथ अपडेट करूँगा :) – Rick

7

दो चीजें हैं आप क्या करने की जरूरत:

  1. स्टोरीबोर्ड में आप नियंत्रक नाम (जैसे LoginView) का उल्लेख किया है और सक्षम उपयोग स्टोरीबोर्ड आईडी
  2. तो फिर तुम उपयोगकर्ता नीचे रेखा है

    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; 
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO]; 
    

उम्मीद है कि इससे मदद मिलती है। अगर आपको अभी भी समस्या हो रही है तो मुझे बताएं।

+0

धन्यवाद इससे भी मदद मिली। – Tander

+0

यदि कुछ यूआईएनएविगेशन नियंत्रक में आपका व्यू कंट्रोलर एम्बेड करें, तो आप 'instantiateInitialViewController()' विधि 'UIStoryBoard' विधि का भी उपयोग कर सकते हैं। यह स्वचालित रूप से आपके स्टोरीबोर्ड पर एक तीर के साथ चिह्नित कंट्रोलर लोड करता है। यदि यह दृश्य नियंत्रक एक कंटेनर है, तो इसके बच्चे भी लोड होंगे। – Vinzzz

0
[self performSegueWithIdentifier:@"buyListSegue" sender:sender]; 
+1

यह उत्तर कुछ स्पष्टीकरण के साथ कर सकता है ... –

+0

सहायक नहीं है। Segues AppDelegate से नहीं हो सकता है या दृश्य नियंत्रक UINavigationController का कोई हिस्सा नहीं हैं – Tander

0

मुझे लगता है कि नियंत्रक पहचानकर्ता "CountrySettings" गलत नियंत्रक पर सेट है: क्या आप तो क्या करना चाहिए वर्तमान एक मॉडल दृश्य नियंत्रक, इस तरह है। आपको NavigationController नहीं मिल रहा है, जहां आप pushViewController पर कॉल कर सकते हैं ...

+0

समस्या हल हो गई, धन्यवाद। चिह्नित जवाब मुद्दा था। – Tander

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