使用开关在整个应用程序中更改文本,单元格和视图控制器的颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用开关在整个应用程序中更改文本,单元格和视图控制器的颜色相关的知识,希望对你有一定的参考价值。

我正在尝试将夜间模式集成到我的应用程序中并部分使其正常工作。这是我的代码以及使用夜间模式开关时应用程序如何更改的屏幕截图。设置屏幕是完美的,但前两个视图控制器没有按照预期的全黑背景改变颜色。

import UIKit

var selectedRunesArray = runesIncReversedArray

class SettingsViewController: UIViewController {

    @IBOutlet weak var allowReversedRunesLabel: UILabel!
    @IBOutlet weak var allowDuplicateRunesLabel: UILabel!
    @IBOutlet weak var nightModeLabel: UILabel!
    @IBOutlet weak var allowReversedRunesSwitch: UISwitch!
    @IBOutlet weak var allowDuplicateRunesSwitch: UISwitch!
    @IBOutlet weak var nightModeSwitch: UISwitch!

    let defaults = UserDefaults.standard

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        if let revRunes = defaults.value(forKey: "reversedRunes") {
            allowReversedRunesSwitch.isOn = revRunes as! Bool
        }

        if let dupRunes = defaults.value(forKey: "duplicateRunes") {
            allowDuplicateRunesSwitch.isOn = dupRunes as! Bool
        }

        if let nMode = defaults.value(forKey: "nightMode") {
            nightModeSwitch.isOn = nMode as! Bool
        }

    }

    @IBAction func reversedRunesChanged(_ sender: UISwitch) {

        defaults.set(sender.isOn, forKey: "reversedRunes")

        if allowReversedRunesSwitch.isOn == true {

            selectedRunesArray = runesIncReversedArray

        } else {
            selectedRunesArray = runesArray
        }

    }

    @IBAction func duplicateRunesChanged(_ sender: UISwitch) {

        defaults.set(sender.isOn, forKey: "duplicateRunes")

        if allowDuplicateRunesSwitch.isOn == true {



        } else {



        }

    }

    @IBAction func nightModeChanged(_ sender: UISwitch) {

        defaults.set(sender.isOn, forKey: "nightMode")

        if nightModeSwitch.isOn == true {

            self.navigationController?.navigationBar.isTranslucent = false
            self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
            self.navigationController?.navigationBar.barStyle = UIBarStyle.black
            self.navigationController?.navigationBar.tintColor = UIColor.black 
            UIApplication.shared.statusBarStyle = .lightContent
            allowReversedRunesLabel.textColor = UIColor.white
            allowDuplicateRunesLabel.textColor = UIColor.white
            nightModeLabel.textColor = UIColor.white
            self.tabBarController?.tabBar.barTintColor = UIColor.black
            view.backgroundColor = UIColor.init(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)

        } else {

            self.navigationController?.navigationBar.isTranslucent = false
            self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
            self.navigationController?.navigationBar.barStyle = UIBarStyle.default
            self.navigationController?.navigationBar.tintColor = UIColor.white
            UIApplication.shared.statusBarStyle = .default
            allowReversedRunesLabel.textColor = UIColor.black
            allowDuplicateRunesLabel.textColor = UIColor.black
            nightModeLabel.textColor = UIColor.black
            self.tabBarController?.tabBar.barTintColor = UIColor.white
            view.backgroundColor = UIColor.groupTableViewBackground

        }

    }

}

App before and after night mode switch is toggled

答案

如果您希望更改在全球范围内发生,我建议采用以下方法:

// an extension here is helpful
extension Notification.Name {

    static let dayOrNight = Notification.Name(rawValue: "dayOrNight")

}


// add the switch and set its state from the current user default
func addNightModeSwitch() {

    toggle.addTarget(self, action: #selector(nightModeSwitchAction(_:)), for: .valueChanged)

    if UserDefaults.standard.bool(forKey: "nightMode") {
        toggle.isOn = true
    } else {
        toggle.isOn = false
    }

    ...

}


// post a notification when the switch is switched
@objc func nightModeSwitchAction(_ toggle: UISwitch) {

    if toggle.isOn {

        // update user default
        UserDefaults.standard.set(true, forKey: "nightMode")

        // post notification
        NotificationCenter.default.post(name: .dayOrNight, object: nil)

    } else {

        // update user default
        UserDefaults.standard.set(false, forKey: "nightMode")

        // post notification
        NotificationCenter.default.post(name: .dayOrNight, object: nil)

    }

}


// add a notification observer to any view controller where you want UI changes
func addNotificationObservers() {

    NotificationCenter.default.addObserver(self, selector: #selector(dayOrNightHandler), name: .dayOrNight, object: nil)

}


// make sure all of the objects that need changes are instance properties of the view controller and change them through the notification observer's action
@objc func dayOrNightHandler() {

    view.backgroundColor = UIColor.black
    someButton.backgroundColor = UIColor.white
    ...

}

在实际开关所在的视图控制器中,您可以为通知观察器的操作方法中的更改设置动画,我认为这是一个很好的触摸(即Twitter)。

以上是关于使用开关在整个应用程序中更改文本,单元格和视图控制器的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中同时为单元格和表格更改设置动画?

具有相同 XIB 单元格和按钮的多个集合视图

如何在基于部分的表格视图中获取开关更改事件中单元格的索引路径

NSTableView,多个单元格和绑定

表视图单元格和表视图标题视图的大小

如何区分用户点击我的表格视图单元格和用户点击单元格中包含的子视图?