当 hidesBottomBarWhenPushed = YES 状态恢复时,导航控制器不隐藏标签栏

Posted

技术标签:

【中文标题】当 hidesBottomBarWhenPushed = YES 状态恢复时,导航控制器不隐藏标签栏【英文标题】:Navigation controller isn't hiding tabbar when hidesBottomBarWhenPushed = YES on state restoration 【发布时间】:2014-04-16 09:19:42 【问题描述】:

我在恢复视图控制器的状态时遇到问题,其中hidesBottomBarWhenPushed=YES 被推送到 UINavigationController 中,该 UINavigationController 位于 UITabBarController 中。

发生的情况基本上是 UINavigationController 堆栈已恢复并且正确的控制器在屏幕上,但该控制器不尊重 hidesBottomBarWhenPushed。

我想出的唯一可行的技巧是 viewDidAppear 上的快速选项卡开关,以使 TabBar 消失,因为它应该在设置 hidesBottomBarWhenPushed 时发生:

- (void)_fixTabBarStateRestorationBug 
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        NSInteger currentTab = (NSInteger)self.tabBarController.selectedIndex;
        self.tabBarController.selectedIndex = abs(currentTab - 1);
        self.tabBarController.selectedIndex = currentTab;
    );

【问题讨论】:

【参考方案1】:

这绝对是一个 ios 错误。上面的解决方案对我来说不是开箱即用的,但是如果你把它放在标签栏控制器的 viewDidAppear 方法中,就会这样做:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    NSInteger currentTab = (NSInteger)self.tabBarController.selectedIndex;
    self.tabBarController.selectedIndex = abs(currentTab - 1);
    self.tabBarController.selectedIndex = currentTab;
);

如果你把它放在视图控制器viewDidAppear 中的视图控制器中,你将创建一个无限循环。为此,请使用问题中提到的一次性令牌方法。

【讨论】:

嘿,Ben,我很好奇,你有没有从viewDidAppear 尝试过。在这个生命周期的角度为我工作。

以上是关于当 hidesBottomBarWhenPushed = YES 状态恢复时,导航控制器不隐藏标签栏的主要内容,如果未能解决你的问题,请参考以下文章

BannerViewController 干扰 hidesBottomBarWhenPushed

使用 hidesBottomBarWhenPushed 在 pop 上显示标签栏

为啥使用半透明导航栏刹车推动动画将“hidesBottomBarWhenPushed”设置为 YES?

hidesBottomBarWhenPushed 永远隐藏 TabBar

如何使用 iOS 6 SDK 解决 hidesBottomBarWhenPushed 的奇怪行为?

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController