3

我遇到了许多人以前在这里遇到过的问题,但是随着新 iOS 版本的发布和 API 的变化,解决方案会及时发生变化。以前的解决方案都不适用于我目前的设置 - XCode 4.2.1、iPhone 模拟器 5.0 或真正的 iPhone 5.0、应用程序以 iOS5 为目标,使用 ARC 和 Storyboard。

我有一个经典的选项卡式应用程序 - 即 UITabBarController,其中有 4 个选项卡...忽略第 2 到第 4 个选项卡。第一个选项卡承载 UINavigationController,其 rootviewcontroller 是 UITableViewController。现在我将 1 个 CustomUIViewController 推入堆栈。

整个设置在 Storyboard 中进行了可视化设计,推送由 segue 完成。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.hidesBottomBarWhenPushed = YES;
}

这有效地隐藏了标签栏,就像 iPod 应用程序在 iPhone 中所做的一样。

但是当我从堆栈中弹出 CustomUIViewController 时,TabBar 不会回来。我把

self.hidesBottomBarWhenPushed = NO;

到所有可能和不可能的地方,但没有运气。

我怎样才能把我的 TabBar 带回来?

4

4 回答 4

7

这是一个总结性的答案,为未来的读者提供一个清晰易读的解决方案,并明确地制定一些相关问题。


问题的解决方法如下代码>

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
}

问题/困惑在于,在prepareForSegue:方法中,可以在源视图控制器(我们现在看到的那个)或目标视图控制器(那个正在被推入堆栈)。通过以任何一种方式设置,您都可以解决问题的前半部分,即。你的 TabBar 被隐藏了。这就是为什么我以前的代码中的“隐藏”部分起作用的原因,我在源视图控制器上设置了属性。在我的代码中

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.hidesBottomBarWhenPushed = YES;
}

这里,“self”指向源视图控制器,而不是目标视图控制器。所以我们必须将它设置为目标视图控制器......

最后一期..这段带点符号的代码不起作用>

segue.destinationViewController.setHidesBottomBarWhenPushed = YES;

您必须像这样调用 setter 方法

[segue.destinationViewController setHidesBottomBarWhenPushed:YES];

该解决方案完全符合 Apple 规范,即“底部栏保持隐藏状态,直到视图控制器(将 hide 属性设置为 YES)从堆栈中弹出”。

最后一件事,不要忘记将 hide 属性的设置范围缩小到特定的 segue

-(void)prepareForSegue:(UIStoryboardSegue *)segue 
                sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SegueIdentifier"]) 
    {
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
    }
}

我将奖励分配给两个帮助我解决这个问题的用户(赏金归 Ash Furrow,接受 Eric Lars0n 的解决方案,这是我在阅读有关赏金和接受的规则后能得到的最接近的解决方案),+ 一个小评论为什么,在他们受人尊敬的线程中。

于 2012-01-02T20:45:52.290 回答
5

我认为你需要设置

segue.destinationViewController.hidesBottomBarWhenPushed = YES;

而不是 self.hides....

于 2011-12-19T01:13:58.237 回答
4

根据Apple的说法,“底部栏保持隐藏状态,直到视图控制器从堆栈中弹出。” 除非您弹出到导航层次结构中更高的视图控制器,否则无法“取消隐藏”底部栏。

您必须想出一些不涉及 hidesBottomBarWhenPushed 属性的其他解决方法。在另一个 SO question中有一个很好的描述如何做到这一点。

于 2012-01-02T15:20:21.083 回答
1

就放进[segue.destinationViewController setHidesBottomBarWhenPushed:YES];prepareForSegue

对我来说工作正常。

于 2012-03-30T21:55:29.280 回答