Ios appDelegate中的委托函数不';不要改变导航栏的颜色

Ios appDelegate中的委托函数不';不要改变导航栏的颜色,ios,swift,uinavigationbar,appdelegate,Ios,Swift,Uinavigationbar,Appdelegate,Xcode 11.3.1,iOS 13 如果应用程序中存在特定条件,我将尝试更改所有视图控制器上导航栏的颜色。在AppDelegate中使用委托函数,使用最初设置全局颜色的相同代码似乎是合乎逻辑的 这是我的密码: class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var myColor : UIColor? let themeColorUS = UIColor(

Xcode 11.3.1,iOS 13

如果应用程序中存在特定条件,我将尝试更改所有视图控制器上导航栏的颜色。在AppDelegate中使用委托函数,使用最初设置全局颜色的相同代码似乎是合乎逻辑的

这是我的密码:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var myColor : UIColor?

    let themeColorUS = UIColor(red: 0.991, green: 0.621, blue: 0.022, alpha: 1.00)
    let themeColorCanada = UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
    let themeColorGeneral = UIColor(red: 0.000, green: 0.954, blue: 0.969, alpha: 1.00)

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        UserDefaults.standard.setValue(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")

        setBarColors(issuingFlag: "General")

        return true
    }

除了当应用程序打开时对
setBarColors()
的初始调用(工作正常)之外,我还从应用程序中的viewController调用它,就像这样,它对导航栏没有任何作用,即使函数在其参数中接收到适当的数据:

    if detailFlag.issuedBy == "Canada"{
    appDelegate.setBarColors(issuingFlag: "Canada")

    }else if detailFlag.issuedBy == "US"{
    appDelegate.setBarColors(issuingFlag: "US")
    }
有人能帮我解释一下为什么函数没有切换
navBar
颜色吗


蒂亚

我建议,因为您希望根据标志模型值动态更改导航栏主题(如背景色),所以不要使用AppDelegate方式,因为这会为您做一次,而且在实际创建任何视图之前设置导航栏样式更像是一种全局方式

有几种方法可以应用它,比如通过
扩展ViewController
基类继承。。以及通过不同的方式获取/设置标志值以更改导航颜色,如通过
userdefaults
变量
。。。我将展示一个示例,让您了解:

import UIKit

class ViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        currentFlag = "Canada"
    }
}

class BaseViewController: UIViewController {

    var currentFlag: String = "General" {
        didSet {
            setNavBarColor()
        }
    }

    private let themeColorUS = UIColor(red: 0.991, green: 0.621, blue: 0.022, alpha: 1.00)
    private let themeColorCanada = UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
    private let themeColorGeneral = UIColor(red: 0.000, green: 0.954, blue: 0.969, alpha: 1.00)

    override func viewDidLoad() {
        super.viewDidLoad()

        setNavBarColor()
    }

    private func setNavBarColor() {
        navigationController?.navigationBar.barTintColor = getBarColor(for: currentFlag)
    }

    private func getBarColor(for flag: String) -> UIColor {
        if flag == "US" {
            return themeColorUS
        } else if flag == "Canada" {
            return themeColorCanada
        }

        return themeColorGeneral
    }
}
这意味着,我们从
AppDelegate
中删除了设置其样式的全局方式,因此我的
使用选项完成了启动,如下所示:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    return true
}
运行以下代码(将“我的ViewController”的标志设置为Canada),并在脚本中使用根ViewController为UINavigationController的ViewController,如下所示:

将使应用程序看起来像:


重构以改进

此外,为了便于管理代码、标志和颜色,您还可以将它们组织在一个结构中,我选择了枚举作为示例,但您也可以使用其他方法,只是给您一个示例,您可以这样做:

import UIKit

enum Flag {
    case us
    case canada
    case general

    static let `default` = Flag.general

    init(rawValue: String) {
        switch rawValue {
        case "US":
            self = .us
        case "Canada":
            self = .canada
        case "General":
            self = .general
        default:
            self = .default
        }
    }

    var themeColor: UIColor {
        switch self {
        case .us:
            return UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
        case .canada:
            return UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
        case .general:
            return UIColor(red: 0.000, green: 0.954, blue: 0.969, alpha: 1.00)
        }
    }
}

class ViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        currentFlag = .canada
    }
}

class BaseViewController: UIViewController {

    var currentFlag: Flag = .default {
        didSet {
            setNavBarColor()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setNavBarColor()
    }

    private func setNavBarColor() {
        navigationController?.navigationBar.barTintColor = currentFlag.themeColor
    }
}

非常感谢您周到详细的回答!由于冠状病毒的疯狂,我还没有实施它。我们将很快这样做,并让您知道结果如何。再次感谢!不客气,只要别忘了标记正确,如果这对你有用,否则让我知道,我自己构建它,让kt一步一步地为你简化。注意安全!昨晚很晚才开始整理,但一旦你明白我需要给我的风投分类,我就看到了一些好的事情发生了。那时已经是凌晨3点了。这是我第一次使用枚举,所以很高兴您向我展示了它。我今天会做更多的工作。谢谢你的检查@响尾蛇99当然!如果这对你也有用的话,一定要把它标记为正确的,这样其他人将来在检查答案时会受益。我这里有点撞到墙了。如果你有时间,你能回答几个问题吗?
import UIKit

enum Flag {
    case us
    case canada
    case general

    static let `default` = Flag.general

    init(rawValue: String) {
        switch rawValue {
        case "US":
            self = .us
        case "Canada":
            self = .canada
        case "General":
            self = .general
        default:
            self = .default
        }
    }

    var themeColor: UIColor {
        switch self {
        case .us:
            return UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
        case .canada:
            return UIColor(red: 0.001, green: 0.686, blue: 0.000, alpha: 1.00)
        case .general:
            return UIColor(red: 0.000, green: 0.954, blue: 0.969, alpha: 1.00)
        }
    }
}

class ViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        currentFlag = .canada
    }
}

class BaseViewController: UIViewController {

    var currentFlag: Flag = .default {
        didSet {
            setNavBarColor()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setNavBarColor()
    }

    private func setNavBarColor() {
        navigationController?.navigationBar.barTintColor = currentFlag.themeColor
    }
}