【问题标题】:The TabBar is hiding and doesn't want to come back no matter how I ask...TabBar 隐藏起来,无论我怎么问都不想回来......
【发布时间】: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?

【问题讨论】:

    标签: objective-c ios5 uitabbar segue


    【解决方案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

    对我来说效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多