2011-12-30 8 views
9

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

    AppDelegate की didFinishLaunchingWithOptions में
  1. एक सशर्त अगर उपयोगकर्ता के प्रवेश की जांच करने के लिए निर्धारित है। नहीं rootViewController loginViewController पर सेट है। एक सफल लॉगिन के बाद ऐप के मुख्य दृश्य में एक सीगू होता है। इस अपमान के साथ मेरी समस्या यह है कि मुझे यकीन नहीं है कि रूट व्यू कंट्रोलर को मुख्य दृश्य में कैसे रीसेट करना है। क्या यह संभव है और कैसे?

क्या रूट व्यू कंट्रोलर सेट किए बिना लॉगिन मोडल दिखाने का कोई अन्य तरीका है? मतलब मैं मुख्य दृश्य में थर्मल आरवीसी रखूंगा।

  1. viewDidAppear एक सशर्त जांच करता है कि उपयोगकर्ता के प्रवेश में मुख्य दृश्य नियंत्रक में

    । यदि loginVC के लिए नहीं एक segue किया जाता है। जब उपयोगकर्ता सफलतापूर्वक लॉग इन करता है तो उसे मुख्य दृश्य में वापस कर दिया जाता है जो मोडल लॉगिन दृश्य को खारिज कर देता है। इस अपमान के साथ समस्या यह है कि मुख्य दृश्य संक्षेप में दिखाया गया है, जिसे मैं नहीं करना चाहूंगा।

  2. कोई अन्य विचार? कृपया मुझे बताएं कि इस परिदृश्य की बात आने पर सबसे अच्छा अभ्यास क्या है। अग्रिम धन्यवाद,

+1

वहाँ कुछ अच्छा जवाब यहां हैं: http://stackoverflow.com/questions/19962276/best-practices-for-storyboard-login-screen-handling-clearing-of-data-upon-logou –

उत्तर

1

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

// Override point for customization after application launch. 
    RootViewController *rootController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; 

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootController]; 

    self.window.rootViewController = navigationController; 
+0

हाँ मैं वाकिफ हूँ appDelegate में rootViewController को सेट करने का। मेरा मुद्दा ऐप के मुख्य दृश्य नियंत्रक में लॉगिन होने के बाद rootViewController को रीसेट करने के बारे में है। यह सुनिश्चित नहीं है कि यह कैसे किया जाता है और यदि यह दृष्टिकोण करने की सलाह दी जाती है। –

+0

लॉग इन करने के बाद रूटव्यू कंट्रोलर क्यों आवश्यक है? –

+0

मुख्य रूप से लॉगिन दृश्य को देखने के लिए अभी भी ढेर में नहीं है। इसके अलावा रूट में सभी दृश्य नियंत्रकों को पॉप बंद करने में सक्षम होने के लिए, यदि उस विकल्प को बाद में विकास में जरूरी है। –

3

कई अलग अलग तरीके की कोशिश कर के बाद, मैं इस के साथ इस समस्या को हल करने में सक्षम था:

-(void)viewWillAppear:(BOOL)animated { 

    // Check if user is already logged in 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if ([[prefs objectForKey:@"log"] intValue] == 1) { 
     self.view.hidden = YES; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 

    // Check if user is already logged in 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if ([[prefs objectForKey:@"log"] intValue] == 1) { 
     [self performSegueWithIdentifier:@"homeSeg3" sender:self]; 
    } 
} 

-(void)viewDidUnload { 
    self.view.hidden = NO; 
} 
3

मेरी राय में इस तरह की किसी चीज़ के लिए सबसे अच्छी रणनीति एक लॉगिन स्क्रीन है जो ऐप लॉन्च होने पर मुख्य दृश्य नियंत्रक पर पहले ही प्रस्तुत की गई है, और उपयोगकर्ता को साइन इन करने के बाद अच्छी तरह से खारिज कर दिया गया है। मुझे पता चला है कि पहले सुझाए गए समाधानों में से अधिकांश (साथ ही सुझाव यहां: Best practices for Storyboard login screen, handling clearing of data upon logout) इस सुंदरता को पूरा न करें।

कुछ कल प्रयोग करने के बाद, मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका है बच्चे दृश्य नियंत्रक का उपयोग करना है:

1. बस के रूप में आप सामान्य (जोड़ने के लिए कोई जरूरत नहीं है Xcode में अपने मुख्य इंटरफ़ेस स्टोरीबोर्ड चुनें अपने appDelegate

main interface

2. के लिए कुछ भी viewDidLoad में अपने मुख्य दृश्य नियंत्रक के लिए निम्न जोड़ें:

// If user is not logged in, show login view controller 
if (!isLoggedIn) { 
    // Instantiate Login View Controller from storyboard 
    UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"]; 

    // Set the Login View Controller's frame 
    loginVC.view.frame = self.view.bounds; 

    // Add login screen as a subview and as a child view controller 
    [self.view addSubview:loginVC.view]; 
    [self addChildViewController:loginVC]; 
    [loginVC didMoveToParentViewController:self]; 

    // Maintain a reference to the Login screen so we can dismiss it later 
    _loginVC = loginVC; 
} 

3. के बाद उपयोगकर्ता में लॉग इन किया है, या तो सूचनाएं या एक प्रतिनिधि का उपयोग करके अपने मुख्य दृश्य नियंत्रक को सूचित करें। फिर आप अपनी इच्छानुसार लॉगिन स्क्रीन को एनिमेट कर सकते हैं।यहाँ मैं एक भंग एनीमेशन का उपयोग कर रहा:

// Animate out the category chooser 
[UIView animateWithDuration:0.2 animations:^{ 
    // Dissolve the login screen away 
    [_loginVC.view setAlpha:0]; 
} completion:^(BOOL finished) { 
    // Remove login screen as a child view controller 
    [_loginVC willMoveToParentViewController:nil]; 
    [_loginVC.view removeFromSuperview]; 
    [_loginVC removeFromParentViewController]; 

    // nil out property 
    _loginVC = nil; 
}]; 

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

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