You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 9.3中重写代码后状态栏颜色仍无法修改

解决状态栏样式仅在初始VC生效的问题

嘿,我太懂这种头疼的情况了!你写的override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }代码本身没问题,但为啥只有初始视图控制器生效?大概率是因为你的其他VC被**导航控制器(UINavigationController)或者标签栏控制器(UITabBarController)**这类容器控制器包裹了——系统默认会优先采用容器控制器的状态栏样式,直接忽略子VC的设置。

下面给你几个靠谱的解决办法,按需选就行:

方法1:直接设置导航栏样式(简单快捷)

如果你的场景里所有VC都需要.lightContent的状态栏,那不用改子类,直接在导航控制器初始化时或者子VC里设置导航栏的barStyle:

// 在子VC的viewDidLoad里或者导航控制器初始化代码中
navigationController?.navigationBar.barStyle = .black

当导航栏barStyle设为.black时,系统会自动把状态栏文字改成白色(也就是.lightContent),一步到位。

方法2:自定义容器控制器子类(灵活适配不同VC)

如果你的APP里不同VC需要不同的状态栏样式,那得给容器控制器写个自定义子类,让它“转发”子VC的状态栏设置:

针对UINavigationController的情况

创建一个自定义导航控制器类:

class CustomNavController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        // 优先返回当前顶层VC的状态栏样式,默认用系统样式兜底
        return topViewController?.preferredStatusBarStyle ?? .default
    }
}

然后在Storyboard或者代码里,把原来的UINavigationController替换成这个CustomNavController,之后每个子VC里的preferredStatusBarStyle设置就会生效了。

针对UITabBarController的情况

同理,自定义标签栏控制器类:

class CustomTabBarController: UITabBarController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        // 返回当前选中VC的状态栏样式,默认用系统样式兜底
        return selectedViewController?.preferredStatusBarStyle ?? .default
    }
}

替换原有的UITabBarController即可。

关键前提检查

别忘了确认你的Info.plist里的View controller-based status bar appearance选项设置为YES(布尔值)。如果这个选项是NO,系统会忽略所有VC的preferredStatusBarStyle设置,直接用Info.plist里的Status bar style配置,这也是很多人踩坑的点!

按照上面的步骤操作,你的状态栏样式应该就能在所有VC里正常生效啦~

内容的提问来源于stack exchange,提问作者dmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:27:34