禁用/隐藏一个视图控制器的根视图控制器

时间:2014-07-20 15:05:04

标签: ios objective-c ios7

我无法隐藏我为整个应用定义为UITabBarController的{​​{1}}。

我试图在显示的第一个视图中隐藏UITabBarController(它是整个应用程序的根视图控制器)。我们的想法是第一个视图有rootViewController个实例,它们跳转到定义的UIImageView(它们也被定义为根UITabBarController的视图控制器)。

有没有办法让第一个视图控制器没有根UITabBarController,但是为定义为viewControllers的所有其他视图保留它?

这里的UIViewController中的代码定义了视图控制器,UITabBarController定义为rootViewController。

AppDelegate

先谢谢你的帮助: - )。

1 个答案:

答案 0 :(得分:1)

我认为解决这个问题的最佳方法是使用带有图标的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方法添加到app delegate的公共接口,以便可以从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转换。