我在隐藏整个应用程序中定义为UITabBarController
的rootViewController
时遇到麻烦。
我试图在显示的第一个视图上隐藏UITabBarController-这是整个应用程序的根视图控制器。这个想法是第一个视图具有UIImageView
实例,这些实例会跳转到已定义的UIViewController
(也定义为根UITabBarController的视图控制器)。
有没有一种方法可以让第一个视图控制器不具有根UITabBarController,而保留所有其他定义为viewControllers的视图?
这是AppDelegate
中定义视图控制器和UITabBarController为rootViewController的代码。
- (void)initViewControllers {
anIdeaVC = [[IdeaViewController alloc] initWithNibName:@"IdeaViewController" bundle:nil];
[anIdeaVC setTabBarItem:[[[UITabBarItem alloc] initWithTitle:@"Idea" image:[UIImage imageNamed:@"iconIdee.png"] tag:0] autorelease]];
aListTableVC = [[ListTableViewController alloc] initWithStyle:UITableViewStylePlain];
[aListTableVC setTitle:@"List"];
aListNC = [[ListNavigationController alloc] initWithRootViewController:aListTableVC];
[aListNC setTabBarItem:[[[UITabBarItem alloc] initWithTitle:@"List" image:[UIImage imageNamed:@"iconList.png"] tag:0] autorelease]];
anInnMapVC = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];
anInnMapNC = [[InnMapNavigationController alloc] initWithRootViewController:anInnMapVC];
[anInnMapNC setTabBarItem:[[[UITabBarItem alloc] initWithTitle:@"InnMap" image:[UIImage imageNamed:@"iconInnMap.png"] tag:0] autorelease]];
aSearchTableVC = [[SearchTableViewController alloc] initWithNibName:@"SearchTableViewController" bundle:nil];
[aSearchTableVC setTitle:@"Search"];
aSearchNC = [[SearchNavigationController alloc] initWithRootViewController:aSearchTableVC];
[aSearchNC setTabBarItem:[[[UITabBarItem alloc] initWithTitle:@"Search" image:[UIImage imageNamed:@"iconSearch.png"] tag:0] autorelease]];
tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:anIdeaVC, aListNC, anInnMapNC, aSearchNC, nil] animated:NO];
[tabBarController setSelectedViewController:anIdeaVC];
[tabBarController setDelegate:self];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self initViewControllers];
[window setRootViewController:tabBarController];
[window makeKeyAndVisible];
return YES;
}
在此先感谢您的帮助 :-)。
最佳答案
我认为解决此问题的最佳方法是使带有图标的vc成为开始的根。然后,当用户进行选择时,创建选项卡栏vc并将其设为根。
创建一个视图控制器(不仅仅是一个视图)以显示图标并获得用户选择。使窗口在启动时成为根目录...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// don't do this
//[self initViewControllers];
// or this
//[window setRootViewController:tabBarController];
// instead do this, create the vc that lets user select an icon
// put your icon view in there
IconSelectVC *iconSelectVC = [[IconSelectVC alloc] init];
[window setRootViewController:iconSelectVC];
[window makeKeyAndVisible];
return YES;
}
将
initViewControllers
方法添加到应用程序委托的公共接口中,以便可以从IconSelectVC调用它。然后向其添加最后一行,以替换窗口的根vc。 // ... the rest of initViewControllers, then
[tabBarController setSelectedViewController:anIdeaVC];
[tabBarController setDelegate:self];
[window setRootViewController:tabBarController];
}
现在,当您决定更改UI时,在IconSelectVC中,获取应用程序委托单例并更改窗口的根。
// in IconSelectVC.m
// when you decide to change to the tab bar.
// Be aware that this vc will be released here, so do any cleaning you need to do here
// e.g. unsubscribe from NSNotifications, clean any timers, finish any asynch requests, etc.
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate initViewControllers];
编辑-我们没有讨论这种过渡的外观-我在这里的建议将导致“丑陋”的过渡(当然,在旁观者的眼中),其中UI只是在一帧内发生变化。获得更好过渡的一种方法(其中几种)是使用os7自定义vc过渡。