Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)

     2023-03-14     85

关键词:

【中文标题】Swift 3 - 通过开关更改所有视图控制器的背景颜色(暗模式/夜间模式)【英文标题】:Swift 3 - Changing background colour of all view controllers, via switch(Dark mode/Night mode) 【发布时间】:2017-05-29 21:56:18 【问题描述】:

我创建了一个开关,让用户可以更改背景颜色(深色模式)。这仅适用于与代码链接的视图控制器。我将如何设置它,以便当开关被激活为暗模式或亮模式时,我的应用程序中的每个视图控制器都会改变,而不仅仅是一个。这是我的代码:

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



【问题讨论】:

可能最简单的方法是将它们全部从一个覆盖 viewDidLoad 的子类中继承,代码如下。 这个tutorial 可能会对你有所帮助。 看在上帝的份上,请阅读风格指南。我什至不知道从哪里开始。 Oscar Apeland - 我刚开始你,你这个精英怪人。如果我不问问题,我怎么能学到……“看在上帝的份上”,如果你对我的问题无话可说,那就去做吧。 【参考方案1】:

你可以像这样创建一个基类(这是我用过的东西。)

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 中设置的所有外观。

现在您所要做的就是更改这些全局变量的颜色值。

【讨论】:

【参考方案2】:

对于我的一个项目,我创建了一个类来控制所有 ViewController 的 UI 配色方案。

class UIColourScheme 
    func set(for viewController: UIViewController) 
        viewController.view.backgroundColor = bgColour
        ...
    
    var bgColour = UIColor.black 
    static let instance = UIColourScheme()
  

然后我会在 viewDidLoad() 中为每个 ViewController 调用这个函数

class MyViewController : UIViewController 
    func viewDidLoad() 
        ...
        UIColourScheme.instance.set(for:self)
    
 

我的配色方案类为所有内容设置颜色,但可以简化为上面的背景颜色。

【讨论】:

【参考方案3】:

你可以用这个

protocol colorable 
   func setcolor(color: UIColor)

class HomeVC: colorable 


【讨论】:

【参考方案4】:

我修改了viewWillAppear 方法。并根据一天中的时间添加暗模式。 您不需要格式化您收到的时间/小时,您可能想在条件语句中使用它。

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(true)

    // get time of the day
    let hour = Calendar.current.component(.hour, from: Date())
    print(hour)

    if hour >= 14 
        overrideUserInterfaceStyle = .dark
    
    else 
        overrideUserInterfaceStyle = .light
    


【讨论】:

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?

】从另一个视图控制器单击uitableviewcell后,swift3更改uitableviewcell?【英文标题】:swift3changeuitableviewcellafterclickuitableviewcellfromanotherviewcontroller?【发布时间】:2016-11-1605:11:41【问题描述】:当用户单击viewcontroller2中的tableview单元格... 查看详情

Swift 3 游戏音乐播放

...图应用程序,其中有几个视图,每个视图都有自己的视图控制器类。我还有一个游戏游戏和一个游戏视图控制器,我想知道如何从开始屏幕视图控制器开始播放游戏音乐并让它继续播放我所有的视图和游戏场景?这样我就不必在... 查看详情

通过一个容器视图传递多个视图控制器 - Xcode 8、Swift 3

】通过一个容器视图传递多个视图控制器-Xcode8、Swift3【英文标题】:PassMultipleViewControllersthroughOneContainerView-Xcode8,Swift3【发布时间】:2017-03-1200:19:12【问题描述】:我只是想在按下按钮时通过容器视图传递一个视图控制器。我的... 查看详情

如何以编程方式使用 Swift 3 在所有视图控制器中显示选项卡栏?

】如何以编程方式使用Swift3在所有视图控制器中显示选项卡栏?【英文标题】:HowtoshowTabbarinallviewcontrollersusingSwift3programmatically?【发布时间】:2017-07-1311:27:28【问题描述】:我是Swift的新手。如何在不使用情节提要的情况下以编... 查看详情

我想在swift 3 xcode中从一个视图控制器到另一个视图控制器

】我想在swift3xcode中从一个视图控制器到另一个视图控制器【英文标题】:IwanttomakeanactionfromoneViewControllertoanotherinswift3xcode【发布时间】:2016-11-1416:09:44【问题描述】:我在第一个视图控制器中有一个ImageView,在另一个视图控制... 查看详情

通过单击 Swift 3 中的 Alert Ok 按钮,翻转回同一视图控制器上的另一个视图

】通过单击Swift3中的AlertOk按钮,翻转回同一视图控制器上的另一个视图【英文标题】:FlipBacktoAnotherViewonthesameviewcontrollerByclicktheAlertOkButtoninSwift3【发布时间】:2017-09-0207:07:34【问题描述】:我想通过使用警报操作Button从一个视... 查看详情

dismissViewControllerAnimated 关闭所有视图控制器到根 [swift]

】dismissViewControllerAnimated关闭所有视图控制器到根[swift]【英文标题】:dismissViewControllerAnimatedcloseallviewcontrollertoroot[swift]【发布时间】:2016-03-0411:30:37【问题描述】:假设我有4个视图控制器第1页----showdetail---->第2页----showdetail--... 查看详情

在没有导航控制器的情况下以编程方式更改视图控制器 Swift

】在没有导航控制器的情况下以编程方式更改视图控制器Swift【英文标题】:ProgrammaticallychangingViewControllerswithoutNavigationControllerSwift【发布时间】:2015-03-1820:57:59【问题描述】:当我按下按钮而不使用导航控制器时,我想切换到... 查看详情

为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3

...时间】:2017-03-2303:25:07【问题描述】:所以我有两个视图控制器。一个包含tableView以显示数组中的数据。第二个viewContro 查看详情

在滚动视图中更改 UIView 而 / 更新滚动视图高度 - Swift 3 / Xcode 8

】在滚动视图中更改UIView而/更新滚动视图高度-Swift3/Xcode8【英文标题】:ChangeUIViewInScrollViewWhile/UpdateScrollViewHeight-Swift3/Xcode8【发布时间】:2017-07-1314:30:10【问题描述】:我有一个带有滚动视图的普通ViewController。在滚动视图中有... 查看详情

在所有视图控制器中创建警报功能 - swift

】在所有视图控制器中创建警报功能-swift【英文标题】:createalertfunctioninallviewcontrollers-swift【发布时间】:2017-04-1208:08:23【问题描述】:我正在尝试声明一个用于在我的应用中显示警报的函数。为避免重复工作,我尝试对我的所... 查看详情

开关打开时更改 UITableViewCells 的背景颜色 - Swift

】开关打开时更改UITableViewCells的背景颜色-Swift【英文标题】:ChangeBackgroundColorofUITableViewCellswhenSwitchison-Swift【发布时间】:2017-02-0923:43:01【问题描述】:我试图让用户在打开暗模式时(使用开关)将表格视图单元格的背景颜色更... 查看详情

Swift 3 - 在视图控制器之间传递变量和函数

】Swift3-在视图控制器之间传递变量和函数【英文标题】:Swift3-PassingVariablesandFunctionsBetweenViewControllers【发布时间】:2017-03-2303:12:03【问题描述】:我目前正在制作一个测试应用程序,您可以在其中使用多点连接绘制和发送图片... 查看详情

如何在情节提要 XCode6 (Swift) 中将所有视图控制器设置为风景

】如何在情节提要XCode6(Swift)中将所有视图控制器设置为风景【英文标题】:HowcanIsetallviewcontrollerasalandscapeinstoryboardXCode6(Swift)【发布时间】:2015-06-2212:17:01【问题描述】:我的iPad应用程序是固定在横向上的,并且在整个生命周期... 查看详情

通过触摸按钮 Swift 3 更改 UIButton 文本标签颜色

】通过触摸按钮Swift3更改UIButton文本标签颜色【英文标题】:ChangeUIButtontextlabelcolorbytouchingthebuttonSwift3【发布时间】:2017-03-2716:21:56【问题描述】:我阅读了一些文章,但没有找到解决我问题的解决方案。目前我正在用Swift3构建... 查看详情

如何使用 swift 在一个视图控制器中更改状态栏颜色?

】如何使用swift在一个视图控制器中更改状态栏颜色?【英文标题】:howtochangestatusbarcolorinoneviewcontrollerusingswift?【发布时间】:2016-05-0520:50:34【问题描述】:UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent,animated:tr... 查看详情

Swift 3:segue 的目标视图控制器中只有 nil 值 [重复]

】Swift3:segue的目标视图控制器中只有nil值[重复]【英文标题】:Swift3:onlynilvaluesindestinationviewcontrollerofsegue[duplicate]【发布时间】:2017-01-0313:43:54【问题描述】:当使用prepare(forSegue)方法将数据传递给segue的目标视图控制器时,目... 查看详情

使用 swift iOS 刷新 Storyboard 视图控制器

】使用swiftiOS刷新Storyboard视图控制器【英文标题】:RefreshStoryboardviewcontrollerusingswiftiOS【发布时间】:2020-04-0215:37:34【问题描述】:我在所有视图控制器中都有按钮来更改语言LanguageViewController.swiftclassLanguageViewController:UIViewControll... 查看详情