4

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

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

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

但挑战是——应该在哪里进行这种条件检查,以及应该如何实例化登录屏幕?

我已经尝试了我能想到的所有排列。

在应用程序中,委托似乎是显而易见的地方,但调用 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

4 回答 4

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;
}
于 2012-09-02T15:09:58.847 回答
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];
于 2012-07-19T14:51:45.257 回答
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)
    }
}
于 2014-11-10T05:01:07.343 回答
-1

通过将第一个视图控制器呈现给用户作为登录屏幕,我能够做到这一点。然后有一个 segue 连接到下一个屏幕,带有 tabview 或 split view 或任何你想要的。

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

于 2012-05-22T20:05:23.183 回答