TabBar 隐藏起来,无论我怎么问都不想回来......

Posted

技术标签:

【中文标题】TabBar 隐藏起来,无论我怎么问都不想回来......【英文标题】:The TabBar is hiding and doesn't want to come back no matter how I ask... 【发布时间】:2011-12-16 10:18:22 【问题描述】:

我遇到了许多人以前在这里遇到过的问题,但是随着新 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?

【问题讨论】:

【参考方案1】:

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


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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    [segue.destinationViewController setHidesBottomBarWhenPushed:YES];

问题/困惑在于,在prepareForSegue: 方法中,可以在源视图控制器(我们现在看到的那个)或目标视图控制器上设置属性“hidesBottomBarWhenPushed”(被压入堆栈的那个)。通过以任何一种方式设置,您都可以解决问题的前半部分,即。你的 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 的解决方案,这是我在阅读有关赏金和接受的规则后最接近的),+ 一个小在他们受人尊敬的线程中评论原因。

【讨论】:

您能否详细说明为什么点符号在这里不起作用? 这可能是一个错误,不幸的是我不知道。【参考方案2】:

我认为你需要设置

segue.destinationViewController.hidesBottomBarWhenPushed = YES;

而不是 self.hides....

【讨论】:

情节提要的视图控制器检查器中甚至没有一个复选框吗? 我什至无法编译它..它说 - 在“id”类型的对象上找不到属性“hidesBottomBarWhenPushed”。 检查器中的segue没有这样的选项。 解决方案是对的,但我们必须调用setter方法,因为点符号不起作用。 [segue.destinationViewController setHidesBottomBarWhenPushed:YES];【参考方案3】:

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

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

【讨论】:

在我几乎失去希望之后,您的评论引导我检查“自我”实际指向的位置,并意识到我无法弹出源控制器,因此再次尝试 Eric Lars0n 的解决方案。【参考方案4】:

只需将[segue.destinationViewController setHidesBottomBarWhenPushed:YES]; 放入prepareForSegue

对我来说效果很好。

【讨论】:

以上是关于TabBar 隐藏起来,无论我怎么问都不想回来......的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - 隐藏 tabBar 并显示 toolBar

在小程序中Tabbar显示和隐藏的秘密

swift 用UIBezierPath自定义中间突出的tabbar

让tabbar自动隐藏

让tabbar自动隐藏

iOS 自定义tab bar 怎么隐藏