加载iOS应用程序后更改根视图控制器.

Mis*_*han 11 viewcontroller ios uistoryboardsegue appdelegate

为了在应用加载时显示我的登录屏幕,而不是在用户登录后显示,我决定在用户​​成功登录时在NSUserDefaults中添加auth对象.当应用程序启动时,检查auth参数,并相应地设置视图控制器(如果用户是auth它将显示一个feed,如果没有它将显示一个登录屏幕)在后一种情况下,我有app委托在用户登录后将根视图控制器重置为源.这是不好的做法还是更好的方法?

app委托中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    IIViewDeckController* deckController = [self generateControllerStack];
    self.rightController = deckController.rightController;
    self.centerController = deckController.centerController;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){
        self.window.rootViewController = deckController;
    }else{
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                 bundle:nil];
        UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"];
        self.window.rootViewController = vc;
    }
    [self.window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
    return YES;
}

- (void) setRoots
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    IIViewDeckController* deckController = [self generateControllerStack];
    self.rightController = deckController.rightController;
    self.centerController = deckController.centerController;
    self.window.rootViewController = deckController;
    [self.window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)

登录视图控制器中:

- (IBAction)loginClick:(id)sender {
    if([_emailField.text length]>0&&[_passField.text length]>0){
        NSString *user = _emailField.text;
        NSString *pass = _passField.text;
        [[API sharedInstance] login:user andPass:pass onCompletion:^(NSDictionary *json){
            NSLog(@"%@", json);
            if(![json objectForKey:@"error"]){
                [API sharedInstance].authorized = 1;
                NSNumber *auth = [NSNumber numberWithInt:1];
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setObject:auth forKey:@"auth"];
                [defaults synchronize];

                captureYouAppDelegate *app = [[UIApplication sharedApplication] delegate];
                [app setRoots]; 
            }else{
                [API sharedInstance].authorized = 0;
            }
        }];
    }else{
        if([_emailField.text length]<1){
            [_emailField becomeFirstResponder];
        }else{
            [_passField becomeFirstResponder];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有比这更好或更容易的方式.谢谢!

WCB*_*rne 6

只是为了澄清.我之前没有任何问题重置了UIWindow的rootViewController,但是在尝试这样做的同时允许设备轮换时遇到了一些问题 - 旋转刚刚停止工作.

在尝试调试时,我直接从Apple的文档中找到了以下内容.以下链接提供了许多有关使用UIWindow的指南.这些都与设备旋转有关,但仍然很好知道.

简短回答,使用根控制器并添加子视图控制器.然后,您可以毫无问题地换出子VC.

•您已将视图控制器的UIView属性添加到UIWindow作为子视图.

不鼓励开发人员将任何视图控制器的视图属性添加为UIWindow的子视图.应用程序的根视图控制器应该在Interface Builder中分配给应用程序窗口的rootViewController属性,或者在从应用程序返回之前在运行时分配:didFinishLaunchingWithOptions:.如果需要同时显示来自多个视图控制器的内容,则应定义自己的容器视图控制器并将其用作根视图控制器.请参阅创建自定义容器视图控制器.

有关详细信息,请查看此技术问答.