保持 UITabbarController 在每个视图中可见

Posted

技术标签:

【中文标题】保持 UITabbarController 在每个视图中可见【英文标题】:Keeping a UITabbarController visible in every view 【发布时间】:2012-04-05 14:16:56 【问题描述】:

我有一个带有自定义 UITabBarController 的应用程序,其中包含五个视图控制器。在每个视图控制器中,可以访问其他视图控制器。理想情况下,我希望我的自定义 UITabBarController 出现在每个 ViewController 中,无论视图控制器是否直接源自标签栏。

认为这可以使用原始五个视图控制器中的每一个中的导航控制器来完成,但是,有没有办法将自定义 UITabBarController 添加到每个视图控制器?我尝试在我的viewDidLoad 方法中通过以下方式做到这一点:

AppDelegate *appDelegate = [(AppDelegate *)[UIApplication sharedApplication] delegate];
tabbarController = appDelegate.tabBarController;

tabbarController.view.frame = CGRectMake(0, 0, 320, 480);
[self.view addSubview:tabbarController.view];

但是当我运行代码时,我的应用程序委托中出现了 bad_access。

有什么想法吗?

【问题讨论】:

如何在标签栏控制器的视图控制器中呈现这些“其他视图控制器”? 确实,使用UINavigationController 作为每个选项卡的根控制器会给你想要的。你有什么特别的原因不想使用它们吗? 通过使用:[self presentModalViewController: myviewController]; @Mutix 主要是因为应用程序的结构是完整的,我不想重做它。我希望能够添加标签栏。 更改代码以使用导航控制器应该是相当简单和快速的。我将为您发布带有示例代码的答案 【参考方案1】:

正如您所说的,使用“UINavigationController”作为每个选项卡的根控制器将实现您想要做的事情。

这是一个如何使用导航控制器轻松设置标签栏的示例:

- (void)setupTabBar 

    // Create nav-controller for local use
    UINavigationController *localNavController;

    // New tabbar controller and array to contain the view controllers
    UITabBarController * theTabBarController = [[UITabBarController alloc] init];

    NSMutableArray *localViewControllersArray = [[NSMutableArray alloc] initWithCapacity:4];


    /*--------------------------------------------------------------------
     * Setup the view controllers for the different tabs
     *-------------------------------------------------------------------*/

    // Root view controller for Tab 1
    UIViewController *vc;

    vc = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab1";

    // Add navigation controller to the local vc array (1 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 2
    vc = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab2";

    // Add navigation controller to the local vc array (2 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 3
    vc = [[ViewController3 alloc] initWithNibName:@"ViewController3" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab3";

    // Add navigation controller to the local vc array (3 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 4
    vc = [[ViewController4 alloc] initWithNibName:@"ViewController4" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab4";

    // Add navigation controller to the local vc array (4 of 4)
    [localViewControllersArray addObject:localNavController];


    // Point the tab bar controllers view controller array to the array
    // of view controllers we just populated
    theTabBarController.viewControllers = localViewControllersArray;

    self.tabBarController = theTabBarController;

    [self.window setRootViewController:self.tabBarController];

    ...

希望这会有所帮助:)

【讨论】:

哇,这真的很容易......谢谢【参考方案2】:

您的 AppDelegate 应该有一个 TabBarController。此 TabBarController 包含一个 ViewController 数组 (tabBarController.viewControllers)。 这些 ViewController 应该是 UINavigation 控制器。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UINavigationController* navController1 = [[UINavigationController alloc] initWithRootViewController:firstOfYourControllers;
    UINavigationController* navController2 = [[UINavigationController alloc] initWithRootViewController:sencondOfYourViewControllers;
    UINavigationController* navController3 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
    UINavigationController* navController4 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
    UINavigationController* navController5 = [[UINavigationController alloc] initWithRootViewController:andSoOn;

    NSArray* viewControllerArray = [NSArray arrayWithObjects:navController1, navController2, navController3, navController4, navController5, nil];

    self.tabBarController = [[UITabBarController alloc] init];

    self.tabBarController.viewControllers = viewControllerArray;


    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

不要以模态方式展示您的 NavigationControllers。它们将显示在您的 TabBarController 之上,并且 TabBarController 将不再可见。也不要尝试在 NavigationController 中显示 TabBarController。

【讨论】:

以上是关于保持 UITabbarController 在每个视图中可见的主要内容,如果未能解决你的问题,请参考以下文章

UITabBarController 选中项

如何从 View 获取数据到 UITabBarController

在 UITabBarController 的 UINavigationController 中推送 UIViewController

如何在 Swift 中制作简单的 UITabBarController?

具有纵向/横向视图的 UITabBarController

在 UITabbarController 中切换选项卡时的 popToRoot UINavigationController