Swift中UIViewController调用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
相关产品推荐
相关产品推荐

