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

Swift中UIViewController调用UINavigationController扩展方法失效解决

解决UINavigationController扩展中设置透明导航栏不生效的问题

嘿,我一眼就发现问题所在啦!你在UINavigationController的扩展方法里犯了一个小错误——你用了navigationController?.navigationBar来访问导航栏,但实际上在UINavigationController的实例方法中,self本身就是导航控制器,navigationController这个属性在这里会返回nil(这个属性是给UIViewController用的,用来获取它所在的导航控制器)。这就导致你的设置代码根本没被执行,自然看不到透明效果。

修正后的扩展代码

把扩展里的navigationController?.navigationBar直接改成navigationBar(或者self.navigationBar,效果一样)就可以了:

import UIKit

extension UINavigationController {
    func makeNavigationBarTransparent() {
        // 直接访问当前导航控制器的navigationBar,不需要再通过navigationController属性
        navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationBar.shadowImage = UIImage()
        // 可选:如果导航栏标题颜色是浅色,可能需要调整成深色,不然透明后看不清
        navigationBar.titleTextAttributes = [.foregroundColor: UIColor.black]
        navigationBar.tintColor = .black
    }
}

你的ViewController调用代码可以保持不变

原来的调用逻辑没问题,只要扩展修正后,在viewDidLoad里调用就能生效:

import UIKit

class StudentsViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.makeNavigationBarTransparent()
    }
}

额外提示

如果之后需要恢复导航栏的默认样式,可以在扩展里再加一个方法:

func restoreNavigationBarDefaultStyle() {
    navigationBar.setBackgroundImage(nil, for: .default)
    navigationBar.shadowImage = nil
    // 恢复默认的标题和 tint 颜色
    navigationBar.titleTextAttributes = nil
    navigationBar.tintColor = nil
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:02