2013-08-14 6 views
9

ऐप लोड होने पर मेरी लॉगिन स्क्रीन दिखाने के लिए, और उपयोगकर्ता लॉग इन करने के बाद, मैंने NSUserDefaults में ऑथ ऑब्जेक्ट जोड़ने का निर्णय लिया है जब उपयोगकर्ता सफलतापूर्वक लॉग इन करता है। जब ऐप लॉन्च किया जाता है कि ऑथ पैरामीटर चेक किया गया है, और व्यू कंट्रोलर तदनुसार सेट किया गया है (यदि उपयोगकर्ता एथ है तो यह एक फीड दिखाएगा, अगर नहीं, तो यह एक लॉगिन स्क्रीन दिखाएगा) बाद के मामले में, मेरे पास ऐप है प्रतिनिधि लॉग इन करने के बाद रूट पर रूट व्यू कंट्रोलर को रीसेट कर देता है। क्या यह खराब अभ्यास है या ऐसा करने का एक बेहतर तरीका है?आईओएस ऐप लोड होने के बाद रूट व्यू कंट्रोलर बदलना।

एप्लिकेशन प्रतिनिधि में:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary  *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    IIViewDeckController* deckController = [self generateControllerStack]; 
    self.rightController = deckController.rightController; 
    self.centerController = deckController.centerController; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){ 
     self.window.rootViewController = deckController; 
    }else{ 
     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" 
               bundle:nil]; 
     UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"]; 
     self.window.rootViewController = vc; 
    } 
    [self.window makeKeyAndVisible]; 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO]; 
    return YES; 
} 

- (void) setRoots 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    IIViewDeckController* deckController = [self generateControllerStack]; 
    self.rightController = deckController.rightController; 
    self.centerController = deckController.centerController; 
    self.window.rootViewController = deckController; 
    [self.window makeKeyAndVisible]; 
} 

लॉगिन दृश्य नियंत्रक में:

- (IBAction)loginClick:(id)sender { 
    if([_emailField.text length]>0&&[_passField.text length]>0){ 
     NSString *user = _emailField.text; 
     NSString *pass = _passField.text; 
     [[API sharedInstance] login:user andPass:pass onCompletion:^(NSDictionary *json){ 
      NSLog(@"%@", json); 
      if(![json objectForKey:@"error"]){ 
       [API sharedInstance].authorized = 1; 
       NSNumber *auth = [NSNumber numberWithInt:1]; 
       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
       [defaults setObject:auth forKey:@"auth"]; 
       [defaults synchronize]; 

       captureYouAppDelegate *app = [[UIApplication sharedApplication] delegate]; 
       [app setRoots]; 
      }else{ 
       [API sharedInstance].authorized = 0; 
      } 
     }]; 
    }else{ 
     if([_emailField.text length]<1){ 
      [_emailField becomeFirstResponder]; 
     }else{ 
      [_passField becomeFirstResponder]; 
     } 
    } 
} 

अगर वहाँ एक बेहतर या आसान कर रही तुलना में जिस तरह से मैं सोच रहा हूँ। धन्यवाद!

+0

की मदद से rootviewcontroller का उपयोग करने के लिए कारण है कि आप 'rootViewController' के रूप में एक सरल' UINavigationController' न जोड़ें सद्व्यवहार दिखा रहा हूँ, और तुम सिर्फ नहीं है चरण यदि उपयोगकर्ता पहले से लॉग इन है तो लॉगिन स्क्रीन को नेविगेशन स्टैक में दबाएं।यह आपके वर्तमान समाधान की तुलना में बहुत आसान और अधिक सुरुचिपूर्ण होगा। – holex

+0

@ होलेक्स यदि लॉग इन करने के बाद टैब बार की भी आवश्यकता है, तो UINavigationController जोड़ना एक विकल्प नहीं होगा, है ना? – Donald

उत्तर

4

मुझे नहीं लगता कि window.rootViewController रीसेट करना एक बुरा अभ्यास है। हालांकि, खिड़की को फिर से बनाने की कोई जरूरत नहीं है।
यदि आप पिछले दृश्य नियंत्रक का उपयोग नहीं करना चाहते हैं, तो नए दृश्य नियंत्रक के साथ विंडो के rootViewController को प्रतिस्थापित करें। यदि आप अपने पिछले व्यू कंट्रोलर पर वापस स्विच करना चाहते हैं, तो अपना व्यू कंट्रोलर पेश करने के लिए -presentViewController: animated: completion: का उपयोग करें।

+0

बस इसे बदलने से मुझे IIViewDeckController गुणों को सेट करने की अनुमति नहीं मिलती है। –

+0

मैं इसके साथ सहमत हूं, रनटाइम के दौरान rootViewController को बदलना बहुत खराब कोड-पैटर्न है। – holex

+1

@ होलेक्स क्या आप कृपया बता सकते हैं कि यह एक बहुत खराब कोड-पैटर्न क्यों है? धन्यवाद! – Donald

0

alloc खिड़की करने की कोई जरूरत फिर आप सीधे इस

window.rootViewController = yourVC; 
5

बस स्पष्ट करने के लिए सेट कर सकते हैं नहीं है। मैंने बिना किसी समस्या के पहले UIWindow के रूट व्यू कंट्रोलर को रीसेट कर दिया था, लेकिन डिवाइस रोटेशन की अनुमति देते समय ऐसा करने का प्रयास करते समय मैं कुछ मुद्दों में भाग गया - रोटेशन ने अभी काम करना बंद कर दिया।

डीबग करने का प्रयास करते समय मुझे सीधे एप्पल के दस्तावेज़ों से निम्नलिखित मिला। नीचे दिए गए लिंक में UIWindow के साथ काम करने के बारे में कई दिशानिर्देश हैं। ये सभी डिवाइस रोटेशन से संबंधित हैं लेकिन अभी भी जानना अच्छा है।

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

• आपने अपने दृश्य नियंत्रक की UIView संपत्ति को UIWindow में एक सबव्यूव के रूप में जोड़ा है।

डेवलपर्स UIWindow के एक सबव्यू के रूप में किसी भी व्यू कंट्रोलर की दृश्य संपत्ति जोड़ने से निराश हैं। आपके एप्लिकेशन के रूट व्यू कंट्रोलर को ऐप विंडो की रूट व्यू कंट्रोलर प्रॉपर्टी या तो इंटरफ़ेस बिल्डर में या एप्लिकेशन से लौटने से पहले रनटाइम पर असाइन किया जाना चाहिए: didFinishLaunchingWithOptions:। यदि आपको एक से अधिक व्यू कंट्रोलर से सामग्री प्रदर्शित करने की आवश्यकता है, तो आपको अपने कंटेनर व्यू कंट्रोलर को परिभाषित करना चाहिए और इसे रूट व्यू कंट्रोलर के रूप में उपयोग करना चाहिए। कस्टम कंटेनर व्यू कंट्रोलर बनाना देखें।

अधिक जानकारी के लिए this technical Q&A देखें।

0

चरण मैं UINavigationController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 

    self.splash = [[SplashViewController alloc] initWithNibName: @"SplashViewController" bundle: nil]; 
    self.window.rootViewController = self.splash; 
    [self.window makeKeyAndVisible]; 
    DLog(@"finished initializing ....."); 
    [self setRootViewController]; 

    return YES; 
} 



- (void) setRootViewController 
{ 
    DLog(@"setRootViewController"); 
    if (self.sessionManager.isLoggedIn) 
    { 
      [self navigateToHomeController]; 

    } else { 
      [self navigateToLoginController]; 
     } 
} 


- (void) navigateToHomeController 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"kStoryBoard" bundle: nil]; 
    UINavigationController* homeNavigationController = [storyboard instantiateViewControllerWithIdentifier:@"kHomeNavController"]; 
    NSArray* controllers = [homeNavigationController viewControllers]; 
    if([controllers lastObject]) 
    { 
     if ([[controllers objectAtIndex:0] isKindOfClass:[HomeViewController class]]) { 
      HomeViewController* homeController = (HomeViewController*) [controllers objectAtIndex:0]; 
      self.window.rootViewController = [[OLNavigationViewController alloc] initWithRootViewController: homeController]; 
     } 
    } 
} 



- (void) navigateToLoginController 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"kStoryBoard" bundle: nil]; 
    UINavigationController* loginNavigationController = [storyboard instantiateViewControllerWithIdentifier:@"kLoginNavController"]; 
    if ([loginNavigationController isKindOfClass:[OLLoginViewController class]]) { 
     OLLoginViewController* loginController = (OLLoginViewController*) loginNavigationController; 
     loginController.shouldHideToolBar = YES; 
     self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController: loginController]; 
    } 
} 
संबंधित मुद्दे