在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:
-
呈现一种模式的观点(你不想要的)
-
在启动时隐藏
tabBar
,一旦证书被validation,显示tabBar
。 但有一个缺点:隐藏/显示tabBar
不能animation。 -
你可以只用一个
viewController
来初始化你的UITabBarController
,viewController
要求提供凭证,一旦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视图切换到你的视图层次结构中,如果这是你想要的。