Swift 3 - 通过开关(暗模式/夜间模式)更改所有视图控制器的背景颜色
问题描述:
设计了一个让用户更改背景颜色(暗模式)的开关。这只适用于代码链接的视图控制器。我怎么设置它,所以当开关被激活到黑暗或光照模式时,我的应用程序中的每个视图控制器都会改变,而不仅仅是一个。我的继承人代码:Swift 3 - 通过开关(暗模式/夜间模式)更改所有视图控制器的背景颜色
import UIKit
类DarkMode:UIViewController的{
@IBOutlet var DarkSwitch: UISwitch!
@IBOutlet var LightSwitch: UISwitch!
var DarkisOn = Bool()
var LightisOn = Bool()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let DarkDefault = UserDefaults.standard
DarkisOn = DarkDefault.bool(forKey: "DarkDefault")
let LightDefault = UserDefaults.standard
LightisOn = LightDefault.bool(forKey: "LightDefault")
if (DarkisOn == true) {
DarkSwitch.isOn = true
LightSwitch.isOn = false
//run dark theme
DarkTheme()
}
if (LightisOn == true) {
DarkSwitch.isOn = false
LightSwitch.isOn = true
//run light theme
LightTheme()
}
}
func DarkTheme() //dark colour
{
self.view.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)
}
func LightTheme() //light colour
{
self.view.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
}
@IBAction func DarkAction(_ sender: Any)
{
DarkSwitch.isOn = true
LightSwitch.isOn = false
//run dark theme func
DarkTheme()
let DarkDefault = UserDefaults.standard
DarkDefault.set(true, forKey: "DarkDefault")
let LightDefault = UserDefaults.standard
LightDefault.set(false, forKey: "LightDefault")
}
@IBAction func LightAction(_ sender: Any)
{
DarkSwitch.isOn = false
LightSwitch.isOn = true
//run light theme func
LightTheme()
let DarkDefault = UserDefaults.standard
DarkDefault.set(false, forKey: "DarkDefault")
let LightDefault = UserDefaults.standard
LightDefault.set(true, forKey: "LightDefault")
}
}
答
你可以在这里创建一个基类这样的(这是我都习惯了。)
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isTranslucent = false
self.navigationController?.navigationBar.barTintColor = MainColor
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]//user global variable
self.navigationController?.navigationBar.barStyle = UIBarStyle.black //user global variable
self.navigationController?.navigationBar.tintColor = UIColor.white //user global variable
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
安装所有的主题。 所有颜色值应该是全局的,您可以从另一个ViewController更改颜色值。
现在宣布所有ViewControllers这样
class HomeViewController: BaseViewController {
}
这样HomeViewController将拥有所有你BaseViewController设置的外观。
现在您只需更改颜色值的全局变量即可。
答
对于我的一个项目我创建的控制在我所有的ViewControllers的UI配色方案的一类。
class UIColourScheme {
func set(for viewController: UIViewController) {
viewController.view.backgroundColor = bgColour
...
}
var bgColour = UIColor.black
static let instance = UIColourScheme()
}
我会再调用viewDidLoad中这个函数()为每个视图控制器
class MyViewController : UIViewController {
func viewDidLoad() {
...
UIColourScheme.instance.set(for:self)
}
}
的一切我的配色方案类设置的颜色,但它可以被简化为与上述背景色。
也许最简单的方法是将它们全部从一个覆盖viewDidLoad的代码中继承,代码如下所示。 –
这[教程](https://www.raywenderlich.com/156036/uiappearance-tutorial-getting-started)可能会帮助你。 –
为了上帝的爱,请阅读风格指南。我甚至不知道从哪里开始。 –