在UITabBarController之前显示XIB?

我面临这个问题几个月,我不知道什么是最好的解决scheme来解决它。问题是,我需要在我的UITabBar显示之前加载一个XIB,更清楚地说,我有我的第一个看法这是用户login(没有标签应显示),当用户login时,应用程序validation信息,之后应该用UITabBarController加载视图,但每次我尝试做到这一点,而不是模态地呈现login视图,两显示视图,login视图和标签栏视图。

您可以首先将loginViewController设置为主window rootViewController ,然后在用户login后,将rootViewController设置为rootViewController

像这样(假设你的loginViewController是viewController1 ):

 Appdelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil]; UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; UINavigationController *myNav1=[[UINavigationController alloc] initWithRootViewController:viewController1]; UINavigationController *myNav2=[[UINavigationController alloc] initWithRootViewController:viewController2]; self.tabBarController = [[UITabBarController alloc] init]; self.tabBarController.viewControllers = [NSArray arrayWithObjects:myNav1,myNav2, nil]; //set the login view self.window.rootViewController = viewController1; [self.window makeKeyAndVisible]; return YES; } -(void)setTabBar{ //self.viewController1=nil; self.window.rootViewController = self.tabBarController; } 

然后从loginViewController调用appDelegate的方法setTabBar

 LoginViewController.m #import "AppDelegate.h" -(void)loginOK{ AppDelegate *del=(AppDelegate*)[[UIApplication sharedApplication] delegate]; [del setTabBar]; //you could add some animation transition between views } 

据我所知, UITabBarController不能被embedded到另一个viewController 。 考虑到这一点,你有这些select:

  1. 呈现一种模式的观点(你不想要的)

  2. 在启动时隐藏tabBar ,一旦证书被validation,显示tabBar 。 但有一个缺点:隐藏/显示tabBar不能animation。

  3. 你可以只用一个viewController来初始化你的UITabBarControllerviewController要求提供凭证,一旦validation,向UITabBarController添加更多的viewControllers (这将添加更多的选项卡)。 这也是您在某些应用程序中可以看到的行为,例如美国银行 (http://itunes.apple.com/us/app/bank-america-mobile-banking/id284847138?mt=8)

可能会有更好的做法。 这些是我的build议。

作为一种简单的方法,将视图添加为窗口的子视图,并在不再需要时将其解除。

例如,把这个代码放在你的appdelegate中(假设loginController是你的appdelegate的一个属性…还有其他的方法,这只是一个例子):

 [self.window addSubview:self.loginController.view]; 

如果您想closures视图,请将其删除:

 [self.loginController.view removeFromSuperview]; 

不要忘记正确释放loginController

这样,您的视图只是简单地“覆盖”在您的标签栏视图。 在这里还有其他的答案,只有当你login完成后才有效地将tabbar视图切换到你的视图层次结构中,如果这是你想要的。