如何使用loginfunction开发基于TabBar的应用程序?

我正在开发一个应用程序,我需要显示一个列表作为一个菜单(课程,课程,成绩,注销)给用户。 所以即使在此之前,我需要显示一个login屏幕。 只有成功和有效的login,我需要重新引导用户到菜单。 所以我打算开发一个基于TabBar的应用程序与4个选项卡。 在这里,我很困惑如何在加载TabBar控制器之前添加login视图控制器。 我想每次select第一个标签。 截至目前,我将我的TabBar控制器作为rootviewcontroller添加到我的AppDelegate窗口 ,然后将login视图控制器作为模式视图控制器呈现。 但是这里的问题是甚至在Login View控制器被加载之前,我的课程视图控制器被加载,因为tabbarcontroller首先加载。 我的实际需求是我需要加载课程视图控制器与基于在login视图控制器中给出的input课程列表。 但是当前视图控制器的loadview甚至在login视图控制器的加载视图之前被加载。 所以我的课程列表总是一样的,无论谁login。我在这里困惑如何前进…任何build议在这里会有很大的帮助…

所以,一个非常快速的例子,可能是; 在你的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 (假设现在 rootViewControllerloginViewController ),你可以这样做(你可以优化转换):

 -(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的initWithNibName:中设置initWithNibName: self.title来设置self.title上的标题。

无需摆弄rootViewController …

只需在视图控制器的viewWillAppear:方法的开始处添加以下代码,该方法通常会首先出现(最有可能是您在第一个选项卡中呈现的VC):

 [self.tabBarController presentModalViewController:loginController animated:NO]; 

其中loginController显然是pipe理您的login屏幕的视图控制器。 如果您在没有animation的情况下显示它,那么当您的应用程序启动时(默认图像消失后),这将是第一个可见的东西。 我使用了相同的方法来显示用户在使用应用程序之前必须阅读的免责声明页面。 它工作得很好,没有问题就到店里去了。

编辑:在这个解决scheme中,loginController必须在用户成功login后closures:

 [self dismissModalViewControllerAnimated:NO]; //Although you might do this animated, this time 

您可以在运行时更改标签栏控制器中的视图控制器数组。 这应该足够你的目的。

我写了一个小例子。 尝试使用以下凭据login:

  • 用户名: john ,密码: doe
  • 用户名: pete ,密码: poe

根据所使用的login名,您将看到不同的选项卡组合。

这个例子可以从我的Dropbox下载: http : //dl.dropbox.com/u/6487838/LoginTabExample.zip