如何从单个UITabBar项有条件地选择UIViewController并保持TabBar可见

时间:2012-09-24 21:34:12

标签: uiviewcontroller storyboard uitabbar

关于S / O的第一个问题,如果我没有遵循任何协议,请道歉。我一直试图使用同一个UITabBar项目中的4个UIViewControllers有条件地显示4种不同类型的场景。它必须是TabBar上的相同项目,因为使用的UIViewController依赖于数据而不是用户选择。

我知道不建议继承UITabBarController,因此我设置了一个UIViewController来处理所需场景的条件选择(参见下面的代码)。这很好用,但尽管尝试了我能想到的一切,却无法在新选择的视图的底部显示TabBar。我也尝试过使用UINavigation控制器,但这不太成功。在Storyboard中,我尝试了设置视图大小和演示样式的所有不同排列,在模拟指标中将底栏更改为标签栏并尝试使用Segues。没有人产生必要的结果。

- (void)viewDidLoad
{
    [super viewDidLoad];

    int m = 1;

    UIViewController *viewController;
    if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 ) {
        viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M31TVC"];
    }else if (m == 4 || m == 6 || m == 9 || m == 11 ){
        viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M30TVC"];
    }else if (m == 13 ){
        viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M29TVC"];
    }else if (m == 2 ){
        viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M28TVC"];
    }else {
        // error code here
    }
    viewController.hidesBottomBarWhenPushed = NO;
    [self presentViewController:viewController animated:NO completion:nil];


}

提前感谢任何知道如何做这件事的人。

1 个答案:

答案 0 :(得分:1)

您应该只替换其视图,而不是尝试替换将向用户显示的控制器。这意味着您应该实现一个容器视图控制器:

  • 创建您的UITabBarController,并将其中一个项目设为UIViewController
  • 将其添加到自定义控制器中并向其添加以下属性。

    @property (nonatomic, strong) IBOutlet UIView *currentView
    @property (nonatomic, strong) UIViewController *currentViewController
    
  • 将UIView添加到情节提要板中的控制器并将其连接到* currentView插座。

现在,每当用户在您的应用中达到此点时,您将执行以下操作:

UIViewController *viewController;
if (month == 1 || 3 || 5 || 7 || 8 || 10 || 12 ) {
    viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M31TVC"];
}else if (month == 4 || 6 || 9 || 11 ){
    viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M30TVC"];
}else if (month == 13 ){
    viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M29TVC"];
}else if (month == 2 ){
    viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"M28TVC"];
}else {
    // error code here
}

[self addChildViewController:viewController];
[viewController didMoveToParentViewController:self];

if (self.currentViewController){
    [self.currentViewController willMoveToParentViewController:nil];

    [self transitionFromViewController:self.currentViewController toViewController:viewController duration:0 options:UIViewAnimationOptionTransitionNone animations:^{
        [self.currentViewController.view removeFromSuperview];
        [self.currentView addSubview:viewController.view];
    } completion:^(BOOL finished) {
        [self.currentViewController removeFromParentViewController];
        self.currentViewController = viewController;
    }];
} else {
    [self.currentView addSubview:viewController.view];
    self.currentViewController = viewController;
}

这是我在我的应用程序上创建的自定义选项卡式控制器,而不是使用默认的UITabBarController。