我正在尝试更改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
}
}
答案 0 :(得分:2)
您不应该等待服务器调用来决定您的根视图控制器 - 一旦调用didFinishLaunchingWithOptions
,您需要来呈现视图。
让一个Root View Controller
在加载时出现一个初始视图控制器并坚持它 - 它的根源是有原因的。
如果您有缓存的令牌,请跳过loginViewController
并启用。计划没有互联网/糟糕的连接/过期令牌,但不要在应用程序委托中放置异步操作,以防止您的UI被呈现。
答案 1 :(得分:1)
Is initial View Controller
Main.storyboard
复选框
window
媒体资源:appDelegate.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
appDelegate.window.rootViewController = controller;
makeKeyAndVisible
方法:[appDelegate.window makeKeyAndVisible];
答案 2 :(得分:1)
在我看来,使用initialViewController作为入口是一种更好的方法,而不是更改rootViewController。当应用程序启动时,必须有一个屏幕,让用户感觉一切顺利。此外,您正在向服务器发出请求,此过程可能会失败或超时。
我的建议是通过initialViewController进行导航。使其可见并放置一些动画或活动指示器,然后当响应到来时,如果登录,请转到您的应用程序mainViewController,否则转到loginViewController。此外,您可以在这里检查互联网连接,并建议用户连接到互联网。
答案 3 :(得分:0)
您无法保持旧视图控制器的显示,但您可以使用黑屏呈现视图控制器,然后在从服务器获得有关会话的响应后,您可以根据需要显示视图控制器。