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

Posted

技术标签:

【中文标题】如何有条件地从单个 UITabBar 项目中选择 UIViewController 并保持 TabBar 可见【英文标题】:How do I conditionally select a UIViewController from a single UITabBar item and keep the TabBar visible 【发布时间】:2012-09-24 21:34:11 【问题描述】:

关于 S/O 的第一个问题,如果我没有遵循任何协议,请原谅。我一直在尝试使用来自同一个 UITabBar 项目的 4 个 UIViewController 有条件地显示 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】:

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

创建您的 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。

【讨论】:

谢谢布雷诺。完美运行。考虑到我在这方面浪费了很多时间,我希望你的帖子对其他人有用。话虽如此,令人惊讶的是,在所有“浪费的时间”中学到了多少! 我很高兴它有帮助。请记住单击我答案开头的复选标记,以便其他人知道它对您有用。 嗨,布雷诺。我刚刚注意到,使用此解决方案时,视图在切换到横向时不会自动调整大小,尽管情节提要中的所有设置都是正确的。对如何解决这个问题有任何想法吗?再次感谢您的解决方案。 我不必在我的应用程序中这样做(它只是纵向的),所以我不能给你一个现成的解决方案。我最好的猜测是,您应该设置视图的 Struts 和 Springs,以便它们在应用程序旋转时正确调整其大小。 CS193P 中的 Paul Hegarty 有一个关于它的课程(我认为它是第 5 号)。这是它的 iTunes 链接:itunes.apple.com/itunes-u/ipad-iphone-application-development/…

以上是关于如何有条件地从单个 UITabBar 项目中选择 UIViewController 并保持 TabBar 可见的主要内容,如果未能解决你的问题,请参考以下文章

有条件地在 UITabBar 选择上显示视图控制器

如何按范围分组,或有条件地从查询结果中选择

未选择 UITabBar 颜色?

如何更有效地从n组中找到满足给定条件的最小组合?

UITabBar 获取选中项

如何有条件地从元组列表中删除元素?