导航栏在 iOS 9.2 中显示错误的导航项

Posted

技术标签:

【中文标题】导航栏在 iOS 9.2 中显示错误的导航项【英文标题】:Navigation bar shows wrong navigation item in iOS 9.2 【发布时间】:2016-02-11 08:47:27 【问题描述】:

UINavigationController'snavigationBar 最初会显示正确的 UINavigationItem,但随后会在每次将 UIViewController 推入堆栈时恢复为之前的 UINavigationItem。

复制步骤:

    UIViewController 推入UINavigationController 堆栈 在导航控制器上设置 navigationBarHidden = YES 将另一个视图控制器推入导航堆栈。 开始交互式弹出过渡,然后取消它。 弹回上一个视图控制器 在导航控制器上设置navigationBarHidden = NO 尝试将视图控制器推入堆栈

看起来-[UINavigationBar _cancelInteractiveTransition] 正在被调用,即使在进入此状态后进行推送转换?我可以在那个符号上设置一个断点,导航栏在它之前显示正确的导航项,在之后显示错误的导航项。


但我想要的是导航控制器的导航栏应该显示当前topViewController的导航项。

【问题讨论】:

【参考方案1】:
@interface UINavigationController (Private)

- (void)_cancelInteractiveTransition:(float)arg1 transitionContext:(id)arg2;

@end

- (void)_cancelInteractiveTransition:(float)arg1 transitionContext:(id)arg2

    BOOL hidden = self.isNavigationBarHidden;
    if (hidden) 
        [self setNavigationBarHidden:NO animated:YES];
    
    [super _cancelInteractiveTransition:arg1 transitionContext:arg2];
    if (hidden) 
        [self setNavigationBarHidden:hidden animated:YES];
    

【讨论】:

你能扩展一下这个答案吗? ***.com/help/how-to-answer 解释你的答案,以便详细说明【参考方案2】:

我最近在 ios10 上遇到了这个问题,我确信它在 iOS9 上存在,假设我们仍然支持它。事实证明,问题在于,在交互式转换开始时,我们设置了 navigationController.navigationBarHidden=NO,然后在取消它时忘记将其设置回 navigationController.navigationBarHidden=YES。导航栏似乎不喜欢连续两次被取消隐藏。我想将其设置为连续两次隐藏也是一样的。好消息是这不是 iOS11 的问题。

【讨论】:

以上是关于导航栏在 iOS 9.2 中显示错误的导航项的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中,导航栏在运行时不可见

在 iOS 11 上,导航项中的搜索栏在导航弹出时折叠并卡在状态栏下

iOS 7 导航栏在翻转水平 Segue 上跳转

移动开发中导航栏和搜索栏在设计中应该注意哪些问题?

导航栏在 Chrome 中损坏,而不是在 IE 或 Firefox 中

导航栏在横向模式下向上移动 - iOS