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") 


} 

}

+2

也许最简单的方法是将它们全部从一个覆盖viewDidLoad的代码中继承,代码如下所示。 –

+0

这[教程](https://www.raywenderlich.com/156036/uiappearance-tutorial-getting-started)可能会帮助你。 –

+0

为了上帝的爱,请阅读风格指南。我甚至不知道从哪里开始。 –

你可以在这里创建一个基类这样的(这是我都习惯了。)

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) 
    } 
} 

的一切我的配色方案类设置的颜色,但它可以被简化为与上述背景色。