如何有条件地从单个 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 可见的主要内容,如果未能解决你的问题,请参考以下文章