我在隐藏整个应用程序中定义为UITabBarControllerrootViewController时遇到麻烦。

我试图在显示的第一个视图上隐藏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过渡。

10-08 05:55
查看更多