显示带故事板的一次性登录屏幕的最佳做法

And*_*oss 9 iphone login storyboard ios ios5

我在这里看到过类似的问题,但没有明确的答案.所以我有一个带有经典用户名/密码表单的模态登录视图,一个Facebook登录按钮和一个注册按钮,我想在用户第一次启动应用程序时显示该按钮.根据我的发现,有两种方法可以实现这一点,并使用缩写.

  1. 在AppDelegate的didFinishLaunchingWithOptions中,条件设置为检查用户是否已登录.如果不是,则将rootViewController设置为loginViewController.成功登录后,segue将进入应用程序的主视图.我对这个方法的问题是我不知道如何将rootViewController重置为主视图.这可能吗?怎么样?

有没有其他方法来显示登录模式而不设置rootViewController?意思是我会将rVC保留在主视图中.

  1. 在viewDidAppear的主视图控制器中,条件检查用户是否已登录.如果不是,则执行对loginVC的segue.当用户成功登录时,他将返回主视图,该视图解除了模态登录视图.这种方法的问题在于简要显示了主视图,我不想这样做.

  2. 还有其他想法吗?请告诉我这种情况下的最佳做法是什么.先感谢您,

cod*_*yko 3

在我看来,解决此类问题的最佳策略是在应用程序启动时在主视图控制器上显示登录屏幕,并在用户登录后很好地关闭并释放。我发现大多数先前建议的解决方案(以及此处的建议:故事板登录屏幕的最佳实践,注销时处理数据清除)并不能优雅地实现这一点。

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

1. 像平常一样在 Xcode 中选择主界面故事板(无需向您的主界面添加任何内容)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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}];
Run Code Online (Sandbox Code Playgroud)

就是这样!这样,主视图控制器始终是窗口的根视图控制器,用户登录后登录屏幕将被释放,并且首次呈现登录屏幕时不会出现闪烁。