如何在App Delegate上调用服务器后更改根控制器?

时间:2016-03-05 13:44:17

标签: ios objective-c appdelegate

我正在尝试更改app delegate上的根控制器。

我正在进行服务器调用以检查登录会话是否有效。如果有效,请显示欢迎页面,否则显示登录页面。

在appDelegate中,我正在使用方法didFinishLaunchingWithOptions进行服务器调用。

我通过我的datamodel委托获得响应,但是当我从服务器获得响应时,旧的根控制器已经显示在屏幕上。

目前,老根管理器首先出现,并在几秒钟内,出现新的根控制器!所以它看起来像一个闪烁的东西!

有没有办法让旧的根控制器出现,直到我从服务器获得回复?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    _dataModel=[DataModal sharedInstance];
    _dataModel.delegate=self;

    NSString *token=[[NSUserDefaults standardUserDefaults]objectForKey:@"token"];
    if (!token) {
        token=@"jkfhgjkfg908";
    }else{
         _dataModel.auth_token=token;
    }

    [_dataModel checkToken:token];

    return YES;
}

//By the time it reaches here, the old root controller is already present on screen
-(void)checkToken:(NSDictionary *)items{

    if ([items[@"success"] isEqual:@1]) {
        AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
        UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
        app.window.rootViewController=[storyboard instantiateViewControllerWithIdentifier:@"DashboardNavController"];

    }else{
        //do nothing, defualt is login view
    }

}

4 个答案:

答案 0 :(得分:2)

您不应该等待服务器调用来决定您的根视图控制器 - 一旦调用didFinishLaunchingWithOptions,您需要来呈现视图。

让一个Root View Controller在加载时出现一个初始视图控制器并坚持它 - 它的根源是有原因的。

如果您有缓存的令牌,请跳过loginViewController并启用。计划没有互联网/糟糕的连接/过期令牌,但不要在应用程序委托中放置异步操作,以防止您的UI被呈现。

答案 1 :(得分:1)

  1. 取消选中Is initial View Controller
  2. 中控制器的Main.storyboard复选框
  3. 初始化appDelegate的window媒体资源:appDelegate.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  4. 设置rootViewController:appDelegate.window.rootViewController = controller;
  5. 并致电makeKeyAndVisible方法:[appDelegate.window makeKeyAndVisible];

答案 2 :(得分:1)

在我看来,使用initialViewController作为入口是一种更好的方法,而不是更改rootViewController。当应用程序启动时,必须有一个屏幕,让用户感觉一切顺利。此外,您正在向服务器发出请求,此过程可能会失败或超时。

我的建议是通过initialViewController进行导航。使其可见并放置一些动画或活动指示器,然后当响应到来时,如果登录,请转到您的应用程序mainViewController,否则转到loginViewController。此外,您可以在这里检查互联网连接,并建议用户连接到互联网。

答案 3 :(得分:0)

您无法保持旧视图控制器的显示,但您可以使用黑屏呈现视图控制器,然后在从服务器获得有关会话的响应后,您可以根据需要显示视图控制器。