iOS 13及其它版本中未能调用preferredStatusBarStyle的解决方法

8

我的应用程序中有多个UITabBar,某些ViewController具有白色状态栏,而某些ViewController具有黑色状态栏。

我的info.plist

View controller-based status bar appearance设置为YES

我的Viewcontroller中有以下代码:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default //or return . lightContent
}

但是preferredStatusBarStyle从未被调用。

我还在我的控制器viewDidLoad中写了下面这行代码,但上述代码仍未被调用。

self.setNeedsStatusBarAppearanceUpdate()

我也已经多次更改了控制器的状态栏外观YESNO,以进行测试,但仍然没有帮助。

我也尝试过以下解决方案和其他stackoverflow答案,但没有任何帮助。

iOS 13上preferredStatusBarStyle不起作用

iOS 12上preferredStatusBarStyle var不起作用?

编辑

我已经尝试了下面的代码,它会返回我topViewController并调用该ViewControllerpreferredStatusBarStyle方法。

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

一旦找到topViewController,它将调用该特定ViewControllerpreferredStatusBarStyle

但问题在于,在UITabBarController -> UINavigationController -> UIViewController中它没有被调用。

需求

我有两个不同的TabBarController

第一个TabBarController的状态栏样式为.lightContent

第二个TabBarController的状态栏样式为.lightContent,并且在不同的控制器中为.default

当我切换到第二个TabBarController时,它将调用第二个TabBarControllerpreferredStatusBarStyle,而所有ViewController的状态栏样式都变为.default,但是我的某些控制器的状态栏样式希望为.lightContent

我该如何实现这个?

任何帮助将不胜感激。

谢谢


我仍然使用UIApplication.shared.statusBarStyle,尽管它已经被弃用,但它仍然可以正常工作,在viewWillAppear中调用它。 - Alexandr Kolesnik
@AlexandrKolesnik,好的,让我试试。 - Kuldeep
@AlexandrKolesnik,我的流程如下。TabBarController--> NavigationController--> ViewController - Kuldeep
@AlexandrKolesnik,我将上述代码行放在ViewControllerviewWillAppear方法中,这样状态栏样式会正确显示1秒钟,然后自动切换到.light - Kuldeep
1
在程序列表中删除 controller-based status bar appearance,并在 viewWillAppear 中调用以下代码:UIApplication.shared.statusBarStyle = .default setNeedsStatusBarAppearanceUpdate() - Alexandr Kolesnik
显示剩余6条评论
4个回答

3
这与iOS 13无关,你的规则是错误的。
在导航控制器情况下,状态栏的颜色不由视图控制器的preferredStatusBarStyle确定。令人惊讶的是,它是由导航栏的barStyle确定的。要获得浅色状态栏文本,请在您的视图控制器中执行以下操作:
self.navigationController?.navigationBar.barStyle = .black

2
我已经找到解决方案。 将以下代码放入代码中以查找 topViewController。
extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

所以一旦找到topViewController,在当前ViewController中会调用以下代码,并且您可以根据需要设置statusBarStyle

override var preferredStatusBarStyle: UIStatusBarStyle { }

在我的情况下,我有2个TabBar
第一个TabBar控制器是.lightContent的,第二个TabBar控制器是.default的,因此创建2个UITabBarController。第一个是.lightContent的,第二个是.default的,并在其中放置preferredStatusBarStyle
因此,当您处于UITabBarController子控制器时,您的UITabBarController preferredStatusBarStyle会被调用,并根据您设置的样式设置子控制器statusBarStyle

我应该把扩展放在哪里?在视图控制器中。OC创建一个新的文件作为扩展吗?因为它对我仍然不起作用。 - lauwis

1

这将会产生一个错误,类似于:无法用只读属性“modalPresentationCapturesStatusBarAppearance”覆盖可变属性。 - Kuldeep
我已经更新了,不知道为什么会错过需要同时调用set和get的部分。 - Muhammad Afzal
请问您能否编写示例代码,演示如何通过此方法更改状态栏样式? - Kuldeep
你写了上面的方法并且它被调用了吗?在preferredStatusBarStyle无法工作的情况下。如果你检查一下,你会发现preferredStatusBarStyle不被调用的情况是presentation case。如果它不起作用,可以给我发送代码或截图,我可以帮助你解决问题。 - Muhammad Afzal

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接