从带 uinavigationbar 的视图滑动到不带 uinavigationbar 的视图时出现错误

Bug when swiping from view with uinavigationbar to one without

我有一个带有 2 个视图控制器的应用程序,ViewController 和 NextViewController。 ViewController没有导航栏,状态栏是白色的。 NextViewController 确实有一个导航栏和一个黑色(默认)状态栏。从 NextViewController 滑动回 ViewController 并取消滑动时,我遇到了一个错误,NextViewController 上的导航栏将消失。故事板只有两个视图,一个按钮和一个动作 segue。错误并不总是发生,但经常足以成为一个问题。该错误与方法 - (UIStatusBarStyle) preferredStatusBarStyle 有关,因为当我删除这些方法时一切正常。

在我的 ViewController 上仍然有一个白色状态栏并启用滑动功能的情况下,我能否以某种方式阻止此错误的发生,或者我是否被迫删除这两个功能?

ViewController

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

下一个ViewController

@implementation NextViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleDefault;
}

其他可能相关的信息:使用 iOS 8 在 iPhone 5s 上遇到此问题,但在使用 iOS 9 的模拟器上也会发生此问题。查看基于控制器的状态栏外观设置为默认值 YES。

如果导航栏隐藏,状态栏样式取决于视图控制器的 - preferredStatusBarStyle,否则取决于导航控制器,因此 NextViewController 中的 - preferredStatusBarStyle 没有用。

看来这个bug与导航控制器的状态栏样式有关,你可以子类UINavigationController覆盖方法childViewControllerForStatusBarStyle来避免这个bug。

@implementation MyNavigationController

- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

@end

现在无论导航栏是否隐藏,状态栏样式都将取决于视图控制器。而且这个错误不会发生。