2012-05-31 10 views
15

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

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

प्रोजेक्ट स्टोरी बोर्ड का उपयोग करता है - जो मुझे लगता है कि एक महान सुविधा है - इसलिए रूट कोड नियंत्रक का चयन और लोड करने वाला अधिकांश कोड पहले से ही ख्याल रखता है। मैं सबसे अच्छी जगह सोचा जोड़ने के लिए मेरी तर्क AppDelegate की application:didFinishLaunchingWithOptions: विधि है:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 
     (NSDictionary *)launchOptions 
{ 
    // select my root view controller here based on credentials present or not 
    return YES; 
} 

लेकिन यह दो सवाल लाया:

  1. इस विशेष प्रतिनिधि विधि के अंदर, रूट दृश्य नियंत्रक पहले से ही है कहानी बोर्ड के आधार पर चुना गया (और लोड किया गया?) क्या मैं लोडिंग प्रक्रिया में पहले दृश्य नियंत्रक चयन को ओवरराइड करने के लिए पहले की जगह पर जा सकता हूं या क्या यह अनिवार्य रूप से जटिलताओं को जटिल करेगा?

  2. पहले दृश्य नियंत्रक को ओवरराइड करने के लिए मुझे कहानी बोर्ड के संदर्भ की आवश्यकता है, लेकिन मुझे के storyboardWithName:bundle: कन्स्ट्रक्टर का उपयोग करने से बेहतर तरीका नहीं मिला। यह गलत लगता है, एप्लिकेशन के पास पहले से ही कहानी बोर्ड का संदर्भ होना चाहिए, लेकिन मैं इसे कैसे एक्सेस कर सकता हूं?

अद्यतन

मैं दूसरे अंक मैं हो रही थी बाहर काम किया, जैसा कि मैंने पाया मेरी यहाँ जवाब:

UIStoryboard: What's the Correct Way to Get the Active Storyboard?

NSBundle *bundle = [NSBundle mainBundle]; 
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"]; 
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle]; 

ऊपर एक नई कहानी पैदा करेगा बोर्ड उदाहरण; सक्रिय उदाहरण प्राप्त करने के लिए, यह एक बहुत आसान है:

UIStoryboard *sb = [[self.window rootViewController] storyboard]; 

कहानी बोर्ड फ़ाइल स्वयं आप दृश्य आपको लोड करने के लिए, उदाहरण के लिए इच्छा के लिए एक पहचानकर्ता सेट करने के लिए में LoginDialog

LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"]; 
[self.window setRootViewController:login]; 

अन्य दृश्य नियंत्रक में, निम्न suffices:

UIStoryboard *sb = self.storyboard; 
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"]; 
[self presentViewController:login animated:NO completion:nil]; 

उत्तर

13

तुम बस खिड़की

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 
     (NSDictionary *)launchOptions 
{ 
    if(your_condition) { 
     UIViewController *newRoot = [your implementation]; 
     self.window.rootViewController = newRoot; 
    } 
    return YES; 
} 

यह मेरे लिए काम किया है रूट दृश्य नियंत्रक रीसेट कर सकते हैं, Xcode5.0.1

+5

'/ * पर स्टोरीबोर्ड के लिए काम कर रहा है ... */self.window.rootViewController = (YourViewController *) [[UIStoryboard storyboardWithName: @" Main " बंडल: nil] instantiateViewControllerWithIdentifier: @ "YourViewControllerID"]; ' –

2

मैं शायद ही स्टोरीबोर्ड का इस्तेमाल किया था & शायद इस अपने प्रश्न का सटीक उत्तर नहीं है बाद में आप इस तरह देखने का दृष्टांत। लेकिन मैं आपको स्टोरीबोर्ड का उपयोग किए बिना बनाई गई मेरी परियोजना में जो कुछ भी किया था, उसका सुझाव दूंगा।

didFinishLaunchingWithOptionsप्रमाणीकरण दृश्य नियंत्रक पहला दृश्य लोड किया गया है। यह लॉगिन प्रमाण पत्र पूछता है। एक बार प्रवेश करने के बाद यह वास्तविक व्यू कंट्रोलर (जैसे टैबबार & सब ..) में प्रोजेक्ट द्वारा उपयोग किया जाएगा।

प्रोजेक्ट में जोड़ा जाने वाला दिलचस्प फीचर है, जब आप क्रेडेंशियल दर्ज करते हैं तो मैंने UIAleretView पॉप अप किया है जो उपयोगकर्ता को तीन विकल्पों में से एक चुनने के लिए कहता है। पासकोड के बिना

  1. साख को बचाने पासकोड
  2. साथ
  3. साख बचाना न साख

बचाने के यहाँ से पारित कोड लेकिन उपयोगकर्ता द्वारा दर्ज 4digit संख्या कुछ नहीं है। जब भी वह 'पासकोड के साथ प्रमाण पत्र सहेजें' चाहता है, तो मैं pushViewController जो पिन के प्रवेश को समाप्त करते समय डिफ़ॉल्ट कीबोर्ड & popviewController के नंबरपैड इंस्टैड दिखाता है। यदि उपयोगकर्ता 'क्रेडेंशियल न सहेजें' & बाद में ऐप खेलने के दौरान अन्य प्रमाणीकरण विकल्पों के लिए जाना चाहता है तो मैंने टैबबार नियंत्रक के अंतिम टैब को 'सेटिंग्स' टैब के रूप में जोड़ा है जिसके अंदर मैं उपयोगकर्ता को प्रमाणीकरण विकल्पों में से एक चुनने की अनुमति देता हूं, UIAlertView के रूप में पॉप किया गया है लॉगिन के बाद ऐप की शुरुआत में शुरुआत।

न भूल keychain

में साख बचाने के लिए संक्षेप में,

  1. AuthenticationViewController-> जाँच लॉगइन क्रेडेंशियल्स कीचेन

1,1 में जमा हो जाती है। अगर संग्रहीत नहीं किया जाता है (यानी 3. क्रेडेंशियल्स को सुरक्षित न करें) -> फिर लॉगिन पेज दिखाएं।

1.2। यदि प्रमाण-पत्र कुंजीचैन में सहेजे गए हैं-> उन्हें निकालें & देखें कि यह पासकोड से जुड़ा हुआ है या नहीं।

1.2.1। यदि यह पासकोड से जुड़ा हुआ है (यानी 2. पासकोड के साथ प्रमाण पत्र सहेजें) -> फिर पासकोड पेज दिखाएं।

1.2.2। यदि यह बंधे नहीं है (1. पासकोड के बिना प्रमाण पत्र सहेजें) -> फिर प्रोजेक्ट के TabBarController पदानुक्रम या अन्य सामान को दिखाएं/लोड करें। यहां वास्तव में आपका ऐप शुरू होता है।

+1

धन्यवाद! मुझे पास कोड जोड़ने की इच्छा है; वर्तमान में मैं केवल मुख्य श्रृंखला में खाता विवरण लिखता हूं। बेशक, मेरे पास प्रमाणीकरण दृश्य दृश्य परिवर्तन को निष्पादित कर सकता है कि क्या मैं संग्रहीत क्रेडेंशियल ढूंढ सकता हूं, लेकिन मैं इसे पहले किया था। –

+0

ठीक है। जब आप स्टोरीबोर्ड का उपयोग करके ऐसा करने में सफल होते हैं, तो मैं सुझाव देता हूं कि आप इसे जिथब या अपने ब्लॉग पर कहीं नमूना परियोजना के रूप में पोस्ट करें। यह वास्तव में बहुत शुरुआती मार्गदर्शन करेगा। –

+1

ज़रूर! प्रश्न btw के दूसरे भाग को मिला :) –

7

मेरे पास आपके जैसा ही परिदृश्य है। मेरा एप्लिकेशन रूट दृश्य नियंत्रक के रूप में UINavigationController का उपयोग करता है। यदि उपयोगकर्ता लॉग इन है, तो मैं उसे NotLoggedInViewController के साथ प्रस्तुत करना चाहता हूं, जबकि अगर यह लॉग इन है तो मैं LoggedInViewController दिखाना चाहता हूं।

स्टोरीबोर्ड में UINavigationController में केवल एक बच्चा हो सकता है, इसलिए आपको इसे प्रोग्रामेटिक रूप से एक और रूट व्यू कंट्रोलर असाइन करने में सक्षम होना चाहिए।

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

फिर भी स्टोरीबोर्ड में, मैं फिर दोनों दृश्य नियंत्रकों को मॉडल करता हूं, और उनमें से एक नेविगेशन नियंत्रक ऑब्जेक्ट से कनेक्ट करता हूं। चूंकि मुझे बाद में अपने कोड से उन्हें एक्सेस करने में सक्षम होना आवश्यक है, इसलिए मैं उनमें से प्रत्येक को दाईं ओर एक्सकोड इंस्पेक्टर का उपयोग करके एक पहचानकर्ता असाइन करता हूं। ये पहचानकर्ता जो मनमानी तार हो सकते हैं, लेकिन चीजों को सरल बनाने के लिए मैं केवल वर्ग के नामों का उपयोग करता हूं।

अंत में मैं तो MyNavigationController वर्ग पर viewDidLoad तरीका लागू:

BOOL isLoggedIn = ...; 

- (void)viewDidLoad { 
    id rootController; 
    if (isLoggedIn) { 
    rootController = [self.storyboard instantiateViewControllerWithIdentifier:@"LoggedInViewController"]; 
    } else { 
    rootController = [self.storyboard instantiateViewControllerWithIdentifier:@"NotLoggedInViewController"]; 
    } 
    self.viewControllers = [NSArray arrayWithObjects:rootController, nil]; 
} 
+0

उत्तर के लिए धन्यवाद; यह सक्रिय स्टोरीबोर्ड का संदर्भ प्राप्त करने और इसके दृष्टिकोण को तुरंत शुरू करने के बारे में मुझे यह जवाब देता है :) मेरा निर्णय मुख्य रूप से पासवर्ड परिवर्तन को संभालने के लिए ऐप प्रतिनिधि के अंदर तर्क जोड़ने की ओर बढ़ रहा है (दूरस्थ सेवा करता है समर्थन सत्र नहीं है और प्रत्येक अनुरोध पर हैश पासवर्ड भेजा जाता है) ... अभी भी उस –

-1

मुख्य स्टोरीबोर्ड पहले ही लोड हो गया है, यह सिर्फ इसके संदर्भ को ढूंढने की बात है ताकि मैं एक और रूट को तुरंत चालू कर सकूं नियंत्रक देखें:

UIStoryboard *mainStoryboard = self.window.rootViewController.storyboard; 

self.window.rootViewController = [mainStoryboard 
    instantiateViewControllerWithIdentifier:@"view-controller-id"]; 
+0

यह उड़ाएगा। सेग्यू टूटा जाएगा, आपको UIKit से कुछ चेतावनियां मिलेंगी, और भगवान जानता है, शायद आईओएस 9 में जो सीआरएएसएच की ओर ले जाएगा। – Andy

+0

@ एंडी जिज्ञासा से बाहर, UIKit से चेतावनियां क्या हैं? –

+0

"चेतावनी: XXX पर XXX प्रस्तुत करने का प्रयास जिसका विचार विंडो पदानुक्रम में नहीं है!" लेकिन मुझे लगता है कि यह राज्य बहाली कैश की सफाई के बाद चला गया है। किसी भी मामले में, यह दृष्टिकोण स्टोरीबोर्ड प्रवाह और राज्य बहाली प्रवाह तोड़ता है। – Andy

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