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

时间:2011-12-30 13:46:44

标签: iphone ios login ios5 storyboard

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

  1. 在AppDelegate的didFinishLaunchingWithOptions中设置条件以检查用户是否已登录。如果不是,则将rootViewController设置为loginViewController。成功登录后,segue将进入应用程序的主视图。我对这个方法的问题是我不知道如何将rootViewController重置为主视图。这可能吗?怎么样?
  2. 有没有其他方法可以在不设置rootViewController的情况下显示登录模式?这意味着我会将rVC保留在主视图中。

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

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

3 个答案:

答案 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;
}

答案 1 :(得分: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;
}];

那就是它!这样,主视图控制器始终是您的窗口的根视图控制器,登录屏幕在用户登录后被取消分配,并且在首次显示登录屏幕时没有闪烁。

答案 2 :(得分: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;