【问题标题】:Add controller to UITabBarController without new item appearing in the tab bar将控制器添加到 UITabBarController 而不在标签栏中出现新项目
【发布时间】:2013-03-28 21:33:45
【问题描述】:

我有一个以 UITabBarController 作为其主控制器的应用程序。

当用户点击一个按钮(不是在标签栏中,只是其他按钮)时,我想在我的 UITabBarController 中添加新的 UIViewController 并显示它,但我不希望新的 UITabBarItem 出现在标签栏中。如何实现这种行为?

我尝试将tabBarController.selectedViewController 属性设置为不在tabBarController.viewControllers 数组中的视图控制器,但没有任何反应。如果我将视图控制器添加到tabBarController.viewControllers 数组,新项目会自动出现在标签栏中。

更新

感谢 Levi,我扩展了我的标签栏控制器以处理 .viewControllers 中不存在的控制器。

@interface MainTabBarController : UITabBarController

/** 
 * By setting this property, tab bar controller will display
 * given controller as it was added to the viewControllers and activated
 * but icon will not appear in the tab bar.
 */
@property (strong, nonatomic) UIViewController *foreignController;

@end


#import "MainTabBarController.h"

@implementation MainTabBarController

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
  self.foreignController = nil;
}

- (void)setForeignController:(UIViewController *)foreignController
{
  if (foreignController) {
    CGFloat reducedHeight = foreignController.view.frame.size.height - self.tabBar.frame.size.height;
    foreignController.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, reducedHeight);

    [self addChildViewController:foreignController];
    [self.view addSubview:foreignController.view];
  } else {
    [_foreignController.view removeFromSuperview];
    [_foreignController removeFromParentViewController];
  }

  _foreignController = foreignController;
}

@end

当用户在标签栏中选择项目时,代码将正确设置“外国”控制器的视图大小并将其删除。

【问题讨论】:

  • 你为什么不直接展示新的视图控制器呢?
  • 标签栏应该是可见的..
  • Hmmmm...然后你要么推它(如果你有一个导航控制器)或将它的视图添加到你可见的视图控制器的视图中,并将其添加为子视图控制器
  • 后一种方法对我有用。谢谢你。您可以将其添加为答案。

标签: ios cocoa-touch uitabbarcontroller uitabbaritem


【解决方案1】:

您可以推送它(如果您有导航控制器)或将其视图添加到可见视图控制器的视图中,并将其添加为子视图控制器。

【讨论】:

  • 关于将子视图控制器添加到 UITabBarController 的一件事。它实际上会将子控制器添加到其 viewControllers 属性中。有时它的标签栏会为子控制器显示一个幽灵项目。
  • @riadhluke 我在 iPhone 6 plus、XR 等更大的设备上也遇到了类似的问题。有什么解决方法吗?
  • @atulkhatri 我认为您应该将子控制器添加到 UITabBarController 的可见子视图控制器而不是 UITabBarController 本身
  • 感谢您的建议,但我试过了,如果我在 UITabBarController 中添加视图,在 UITabBarController 的子项中添加视图控制器,则会导致不一致。我也无法从 UITabBarController 中的“viewcontrollers”数组中删除控制器。
【解决方案2】:

您可以通过以下方式呈现新的视图控制器:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

或者,如果您的 UIViewControllers 之一在 UINavigationController 内,您可以:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

【讨论】:

  • 如果我从标签栏控制器呈现新控制器,标签栏将被隐藏。不幸的是,我也不能使用第二种方法。
  • 应用中有很多屏幕。选项卡栏提供对六个最常用屏幕的访问。其他屏幕可以通过左侧滑动菜单访问(如 Facebook 应用程序)。但是所有的屏幕应该看起来都一样 - UINavigationController inside UITabBarController。
猜你喜欢
  • 2019-08-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多