【问题标题】:iOS XCode6 Status Bar Hidden breaks navigation controlleriOS XCode6 状态栏隐藏中断导航控制器
【发布时间】:2014-12-09 11:36:51
【问题描述】:

我正在做一个项目,XCode 6 似乎带来了一些错误。

描述我需要/想要的:我想要在某些视图控制器中全屏显示(没有状态栏) 示例:

VC0(带状态栏)-> VC1(不带状态栏)-> VC2(带状态栏)

我已经测试了 2 种方法,“查看基于控制器的状态栏外观”是和否。

[选择是]
我在 VC1 中将 prefersStatusBarHidden 设置为 YES,在 VC0、VC2 中设置为 NO
--> XCode5,一切似乎都运行良好
--> XCode6,导航控制器坏了,导航栏有奇怪的行为,如果我通过推送控制器转到 VC2,返回按钮转到 VC0

[没有]
我在 VC1 中的 viewWillAppear 和 viewWillDisappear 中设置了 setStatusBarHidden
--> XCode5,一切似乎都运行良好
--> XCode6,后退按钮引发“在意外状态下完成导航转换。导航栏子视图树可能已损坏。”在日志中,有时,我的导航栏行为不稳定。

这里是描述的示例代码:https://github.com/phetsana/statusbarnavigationcontroller

关于这个的一些解决方案?

【问题讨论】:

    标签: ios xcode6 hidden statusbar navigationcontroller


    【解决方案1】:

    [选择是]

    ViewController:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        self.navigationItem.leftBarButtonItem = nil;
        self.navigationController.navigationBar.topItem.title = @"VC 0";
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        ViewController1 *controller = segue.destinationViewController;
        self.navigationController.navigationBar.topItem.title = @"VC 1";
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:controller action:@selector(backBtnClicked:)];
    }
    

    ViewController1:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backBtnClicked:)];
    }
    

    并在其头文件中添加:

    - (void)backBtnClicked:(id)sender;
    

    我注意到当从 VC0 推送到 VC1 时,在调用 VC0 的 viewWillDisappear 之前调用了 VC1 中的 prefersStatusBarHidden 方法。我记录了self.navigationController.navigationBar.backItem.titleself.navigationController.navigationBar.topItem.title 看看发生了什么。状态栏在VC1中隐藏时,不隐藏时日志不同,从VC2弹回VC1时,backItem变为nil,topItem变为VC0的title。不应该,所以为了保持VC1的标题,我们需要在VC1出现时将topItem的标题设置为VC1的标题。

    here开始有规则显示导航栏的最左、中、右内容。

    如果任何一个视图都没有指定自定义栏按钮项 控制器,使用默认的后退按钮,其标题设置为 前一个视图控制器的 title 属性的值——也就是说, 视图控制器在堆栈上一层。

    [否]

    在意外状态下完成导航转换。 导航栏子视图树可能会损坏

    这可能是并发动画造成的,因为隐藏/显示状态栏和popviewController是同时发生的,在你把代码移到viewDidDisappearviewDidAppear之后,警告就消失了。

    【讨论】:

    • 您好 gabbler,谢谢您的回答。使用自定义返回方法的第一个解决方案似乎是我的问题的一个很好的答案。您的第二个提议与我想要的不符,因为当用户使用手势(交互式滑动)或按钮返回时,我需要全屏(不带状态栏)。
    • 没问题,我也觉得第一种方案比较好。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多