Ios appDelegate中的委托函数不';不要改变导航栏的颜色
Xcode 11.3.1,iOS 13 如果应用程序中存在特定条件,我将尝试更改所有视图控制器上导航栏的颜色。在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(
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
}
}