2011-12-30 37 views
9

我在這裏看到過類似的問題,但沒有明確的答案。因此,我有一個模式登錄視圖,其中包含經典的用戶名/密碼錶單,Facebook登錄按鈕和一個Sign Up按鈕,我想在用戶第一次啓動應用程序時顯示該按鈕。從我發現的方法來看,有兩種方法可以實現這一點,並且有簡明扼要。顯示一次性登錄屏幕w /故事板的最佳做法

  1. 在AppDelegate的didFinishLaunchingWithOptions條件設置爲檢查用戶是否登錄。如果不是rootViewController設置爲loginViewController。在成功登錄後,會在應用程序的主視圖中顯示輪播。我這個問題的問題是我不知道如何將rootViewController重置爲主視圖。這是可能的和如何?

是否有任何其他方式顯示登錄模式而不設置rootViewController?這意味着我會保持主要觀點。

  1. 在viewDidAppear如果條件檢查用戶所登錄的主視圖控制器

    。如果進行不是SEGUE到loginVC。當用戶成功登錄時,他會返回到解除模態登錄視圖的主視圖。這個問題的問題是簡要地顯示了主視圖,我不想這樣做。

  2. 還有其他想法嗎?請讓我知道什麼是這種情況下的最佳做法。謝謝你在前進,

+1

這裏有一些很好的答案:http://stackoverflow.com/questions/19962276/best-practices-for-storyboard-login-screen-handling-clearing-of-data-upon-logou – 2014-02-19 19:58:25

回答

1

您可以通過簡單地設置一個導航控制器通過AppDelegate中設置RootViewController的,當你做檢查,設置導航控制器根視圖取其查看您想在要顯示那時。我認爲,如果你的if語句添加你想要做這樣的事情應該工作:

// 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。不知道這是如何做的,如果這是可取的做法。 – 2011-12-30 16:23:17

+0

爲什麼在登錄後它是rootViewController? – 2011-12-30 16:30:39

+0

主要用於沒有登錄視圖仍在視圖堆棧中。此外,爲了能夠做到像所有視圖控制器一樣的動作,直到根目錄,如果該選項在開發中稍後需要的話。 – 2011-12-30 17:05:47

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; 
}]; 

就是這樣!這樣,主視圖控制器始終是您的窗口的根視圖控制器,登錄屏幕在用戶登錄後取消分配,並且在首次顯示登錄屏幕時沒有閃爍。