我正在开发一个应用程序,我需要向用户显示一个列表作为菜单(课程、课程、成绩、注销)。所以即使在此之前,我也需要显示一个登录屏幕。只有在成功且有效的登录后,我才需要将用户重定向到菜单。所以我计划开发一个带有 4 个选项卡的基于 tabBar 的应用程序。在这里,即使在加载 TabBar 控制器之前,我也对如何添加登录视图控制器感到困惑。我希望每次都选择第一个选项卡。到目前为止,我正在将我的TabBar 控制器作为 rootviewcontroller 添加到我的AppDelegate 窗口,然后将登录视图控制器呈现为模态视图控制器。但是这里的问题甚至在登录视图控制器之前已加载,我的课程视图控制器已加载,因为首先加载了 tabbarcontroller。我的实际要求是我需要根据登录视图控制器中给出的输入来加载带有课程列表的课程视图控制器。但是当然视图控制器的加载视图甚至在登录视图控制器的加载视图之前就被加载了。所以无论谁登录,我的课程列表总是相同的。我在这里对如何前进感到困惑......这里的任何建议都会有很大帮助......
3 回答
所以,一个非常简单的例子,可能是;在你的loginViewController
你应该有一些类似这样的方法:
//Call this after the user has done with the login
-(IBAction)remove:(id)sender{
AppDelegate *del=(AppDelegate*)[[UIApplication sharedApplication] delegate];
//Set some data based on the user's input (eg some property shared in the AppDelegate)
//del.dataEnterByTheUser=someData;
[del removeLoginView];
}
然后在你的(AppDelegate
假设现在是)你可以这样做(你可以优化转换):rootViewController
loginViewController
-(void)removeLoginView{
UITabBarController *tabVC=[[UITabBarController alloc] init];
ViewController *v1=[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
//v1.data=self.dataEnterByTheUser;
ViewController *v2=[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
NSArray *arrayVC=[NSArray arrayWithObjects:v1,v2, nil];
[tabVC setViewControllers:arrayVC];
[tabVC setSelectedViewController:0];
CGRect rectVC=self.loginViewController.view.frame;
rectVC.origin.y=self.view.frame.size.height;
[UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.loginViewController.view.frame=rectVC;
} completion:^(BOOL finished){
[self.loginViewController.view removeFromSuperview];
self.loginViewController=nil;
self.window.rootViewController=tabVC;
}];
}
还要记得在每个viewControllers 中设置tabItem 上initWithNibName:
的self.title
标题。
无需摆弄rootViewController ...
viewWillAppear:
只需在通常首先出现的视图控制器方法的开头添加以下代码(很可能是您在第一个选项卡中呈现的 VC):
[self.tabBarController presentModalViewController:loginController animated:NO];
loginController 显然是管理登录屏幕的视图控制器。如果您在没有动画的情况下显示它,它将是您的应用启动时(默认图像消失后)首先看到的内容。我使用相同的方法来显示免责声明页面,用户在使用该应用程序之前必须阅读该页面。它工作得很好,并且毫无问题地到达了商店。
编辑:在此解决方案中,登录控制器必须在用户成功登录后自行关闭:
[self dismissModalViewControllerAnimated:NO]; //Although you might do this animated, this time
您可以在运行时更改选项卡栏控制器中的视图控制器数组。这应该足以满足您的目的。
我写了一个小例子。尝试使用以下凭据登录:
- 用户名:
john
,密码:doe
- 用户名:
pete
,密码:poe
根据使用的登录名,您将看到不同的选项卡组合。
该示例可以从我的 Dropbox 下载: http: //dl.dropbox.com/u/6487838/LoginTabExample.zip