首页 > 解决方案 > 如何调试 navigationcontroller.tintColor 不变?

问题描述

出于某种原因,我无法弄清楚为什么我无法更改tintColor我的应用程序中导航栏按钮的按钮,而且我不知道如何找出原因。你能推荐我如何调试这个问题吗?

我将此添加到我的视图控制器的 viewDidLoad 中:

UINavigationBar.appearance().tintColor = .green

但是,没有任何变化,后退按钮和 Aa bar 按钮保持默认的灰色。

导航+状态栏是半透明的,位于整个应用程序的背景颜色之上viewcontroller

我可以barbutton在一个测试应用程序中将其更改为 .green (将其添加到 vc 的 ViewDidLoad 中,确保将 barbutton 图像资产设置为模板,以便它们采用我设置的颜色) . 但无论出于何种原因,同样的事情在我的应用原型中不会改变。

有什么我可能不知道的常见原因吗?

添加:栏按钮仅通过情节提要添加。

这是尝试通过 1 个视图控制器的 viewDidLoad 更改其颜色的代码:

Class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        UINavigationBar.appearance().tintColor = .green
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
    }

}

标签: iosswift

解决方案


如果你想使用全局appearance()代理,那么你不能在你的视图控制器中这样做。

如果要更改视图控制器的tintColorin viewDidLoad,则必须navigationController直接在控制器的实例上进行设置:

navigationController?.navigationBar.tintColor = .green

要使用appearance()代理并tintColor为导航栏设置全局,您必须在初始化导航控制器之前执行此操作。

例如,如果您在应用程序委托中执行此操作,它将起作用application(_:didFinishLaunchingWithOptions:)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UINavigationBar.appearance().tintColor = .green
    return true
}

有关原因的详细信息,请参阅UIAppearance文档:

https://developer.apple.com/documentation/uikit/uiappearance

“iOS 在视图进入窗口时应用外观更改,它不会更改已经在窗口中的视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除视图,然后放回去。”


推荐阅读