显示一次login屏幕w /故事板的最佳做法

我在这里看到类似的问题,但没有一个明确的答案。 因此,我有一个模式login视图,其中包括经典的用户名/密码表单,Facebookloginbutton和一个注册button,我想在用户第一次启动应用程序时显示该button。 从我发现有两种方法来实现这一点,以shortcumings。

  1. 在AppDelegate的didFinishLaunchingWithOptions中设置一个条件来检查用户是否login。如果不是,则将rootViewController设置为loginViewController。 在成功login之后,会在应用程序的主视图中显示一个细节。 我这个问题的问题是,我不知道如何重置rootViewController到主视图。 这是可能的和如何?

有没有其他的方式来显示login模式而不设置rootViewController? 这意味着我会保持主要观点。

  1. 在viewDidAppear中的主视图控制器中,条件检查用户是否login。如果不是执行loginVC的segue。 当用户成功login时,他会返回到解除模态login视图的主视图。 这个问题的问题在于主要的观点被简要地显示出来了,我不想这样做。

  2. 任何其他的想法? 请让我知道什么是这种情况下的最佳做法。 先谢谢你,

尝试了很多不同的方法之后,我可以用这个解决这个问题:

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

在我看来,像这样的最好的策略是在应用程序启动时已经在主视图控制器上呈现的login屏幕,并且在用户login后很好地解除分配。我已经发现大多数先前build议的解决scheme(以及这里的build议: Storyboardlogin屏幕的最佳实践,在注销时处理清除数据 )并不能完美地实现这一点。

经过一些昨天的试验后,我认为这样做的最好方法是使用子视图控制器:

1.在Xcode中select你的主界面故事板,就像你平常一样(没有必要添加任何东西到你的appDelegate

主界面

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.用户login后,通过使用通知或委托来通知主视图控制器。 然后,您可以以任何您希望的方式将login屏幕制作成animation。 这里我使用了一个溶解animation:

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

而就是这样! 这样,主视图控制器永远是你的窗口的根视图控制器,login屏幕在用户login后被取消分配,并且在第一次呈现login屏幕时没有闪烁。

您可以通过设置一个导航控制器来设置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;