使用故事板和拆分视图控制器在应用启动时正确显示条件登录屏幕?

时间:2012-05-10 20:43:35

标签: ios5 uisplitviewcontroller uistoryboard

这看起来应该很简单,但事实证明它有很多具有挑战性的细微差别 - 而且我还没有在Stack Overflow上的其他地方找到答案,它可以完全,清楚,简单地回答这个问题。

简而言之 - 我有一个使用故事板来布局应用程序流的iPad应用程序,以及一个拆分视图控制器作为主要的根视图控制器。

此应用程序在启动时检查是否存储了登录凭据,如果存在,则会直接跳转到UI,如果不存在,则会显示全屏登录页面。

挑战虽然 - 应该在哪里进行这种有条件的检查,以及如何实例化登录屏幕?

我已经尝试过我能想到的每一种排列。

在app中,委托似乎是显而易见的地方,但是调用segues或模态弹出窗口似乎被忽略了,因为故事板中的视图尚未生效。

在拆分视图的细节控制器的启动方法中,下一个显而易见的地方似乎是。

我能找到的最接近工作的解决方案如下所述: https://stackoverflow.com/a/8224389/529774

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

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self presentModalViewController:vc animated:NO];
}

但是,通过拆分视图的详细视图控制器调用此实现,底层拆分视图会在屏幕上短暂闪烁。

如果我从viewDidAppear更改为viewWillAppear,则没有闪光灯 - 但即使屏幕旋转为横向,登录视图也会以纵向绘制。

正如我所说 - 这种条件登录显示似乎应该是常见且简单的,但我找不到一个简单的工作示例,它结合了拆分视图,故事板,旋转感知,并保持UI从闪烁。

任何提示?指出良好的工作实例?

4 个答案:

答案 0 :(得分:2)

我有完全相同的问题,但经过多次搜索,Duane的回答给了我一些见解。他的回答仍然在前一个视图中闪现,但我通过使用:

解决了这个问题
-(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 :(得分:1)

您必须先将window.hidden属性设置为NO,然后才能添加子视图:

UITabBarController* tc = (UITabBarController*) self.window.rootViewController;

// Present the log in view controller
self.window.hidden = NO; // the window is initially hidden
[tc presentViewController:logInViewController animated:NO completion:NULL];

答案 2 :(得分:0)

这就是我在SWIFT中解决它的方法

override func viewWillAppear(animated: Bool) {
    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        self.view.hidden = true
    } else {
        self.view.hidden = false
    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        println("this should work")
        self.performSegueWithIdentifier("Login", sender: self)
    }
}

答案 3 :(得分:-1)

我能够通过向用户呈现第一个视图控制器作为登录屏幕来实现此目的。然后有一个segue连接到下一个屏幕,带有tabview或拆分视图或任何你想要的。

第一个控制器处理默认值和登录凭据,一旦检查并验证完毕,就会跟随segue ...否则会向用户显示登录和/或错误并坐在那里。