Спасибо. Я посмотрю на это, когда буду за компьютером. И мое приложение остается в соответствии с цветами. Все в основном белое и черное, кроме изображений профиля пользователя и т. Д.

аюсь добавить тему в свое приложение (темная тема). Поэтому, когда пользователь нажимает на переключатель активности, он переводит все приложение в темный режим. Я жестко запрограммировал режим темноты, чтобы посмотреть, как он будет выглядеть; однако теперь я хотел бы иметь возможность включать и отключать его через UISwitch, но я не уверен, как это сделать?

class DarkModeTableViewCell: UITableViewCell {

var DarkisOn = Bool()
let userDefaults = UserDefaults.standard


@IBOutlet var darkModeSwitchOutlet: UISwitch!

override func awakeFromNib() {
    super.awakeFromNib()


}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}


@IBAction func darkModeSwitched(_ sender: Any) {

    if darkModeSwitchOutlet.isOn == true {

        //enable dark mode

        DarkisOn = true

        userDefaults.set(true, forKey: "DarkDefault")
        userDefaults.set(false, forKey: "LightDefault")



    } else {

        //enable light mode
        DarkisOn = false

        userDefaults.set(false, forKey: "DarkDefault")
        userDefaults.set(true, forKey: "LightDefault")
    }

}



}



class DarkModeViewController: UIViewController {



func set(for viewController: UIViewController) {



    viewController.view.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)
        viewController.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    viewController.navigationController?.navigationBar.tintColor =     UIColor.white
    viewController.navigationController?.navigationBar.barStyle =     UIBarStyle.black
    viewController.tabBarController?.tabBar.barStyle = UIBarStyle.black






}
static let instance = DarkModeViewController()
}

и затем я вызываю функцию в каждом из контроллеров представления, чтобы увидеть, как она выглядит, но мне нужно иметь возможность получить доступ к значению bool, если переключатель включен или выключен, и если это так, сделайте это эта функция, иначе просто оставить все как есть. Если у вас есть дополнительные вопросы, пожалуйста, дайте мне знать, я знаю, что некоторые из них могут не иметь особого смысла.

Ответы на вопрос(2)

Решение Вопроса

NSNotificationCenter API).

Идея состоит в том, чтобы уведомлять контроллеры представления в режиме реального времени, когда темный режим включен и когда он отключен, чтобы они также могли адаптироваться к изменениям в режиме реального времени. Вам не нужно проверять состояние коммутатора или чего-либо подобного.

Начните с создания двух уведомлений (вы также можете сделать это только с одним и передать нужную тему вuserInfo словарь, но в этом случае проще создать два уведомления, так как вам нужно разыграть и что-не со Swift).

NotificationsName+Extensions.swift:

import Foundation

extension Notification.Name {
    static let darkModeEnabled = Notification.Name("com.yourApp.notifications.darkModeEnabled")
    static let darkModeDisabled = Notification.Name("com.yourApp.notifications.darkModeDisabled")
}

На всех ваших «контролируемых» контроллерах представления слушайте эти уведомления:

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add Observers
        NotificationCenter.default.addObserver(self, selector: #selector(darkModeEnabled(_:)), name: .darkModeEnabled, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(darkModeDisabled(_:)), name: .darkModeDisabled, object: nil)
    }

Не забудьте удалить их вdeinit, поскольку отправка уведомлений недействительным объектам вызывает исключение:

deinit {
    NotificationCenter.default.removeObserver(self, name: .darkModeEnabled, object: nil)
    NotificationCenter.default.removeObserver(self, name: .darkModeDisabled, object: nil)
}

В ваших "themable" контроллерах представления, реализуйтеdarkModeEnabled(_:) а такжеdarkModeDisabled(_:):

@objc private func darkModeEnabled(_ notification: Notification) {
    // Write your dark mode code here
}

@objc private func darkModeDisabled(_ notification: Notification) {
    // Write your non-dark mode code here
}

Наконец, переключение вашего переключателя вызовет любое уведомление:

@IBAction func darkModeSwitched(_ sender: Any) {

    if darkModeSwitchOutlet.isOn == true {
        userDefaults.set(true, forKey: "darkModeEnabled")

        // Post the notification to let all current view controllers that the app has changed to dark mode, and they should theme themselves to reflect this change.
        NotificationCenter.default.post(name: .darkModeEnabled, object: nil)

    } else {

        userDefaults.set(false, forKey: "darkModeEnabled")

        // Post the notification to let all current view controllers that the app has changed to non-dark mode, and they should theme themselves to reflect this change.
        NotificationCenter.default.post(name: .darkModeDisabled, object: nil)
    }

}

При этом все ваши контроллеры представлений будут уведомлены в режиме реального времени, когда «тема» изменится, и они будут реагировать соответствующим образом. Обратите внимание, что вам нужно принять меры, чтобы показать правильный режим при запуске приложения, но я уверен, что вы делаете это, так как вы используете UserDefaults и предположительно проверяете их. Также стоит упомянуть, что NSNotificationCenter не является поточно-ориентированным, хотя это не должно иметь значения, так как это весь код пользовательского интерфейса, который все равно должен идти в основном потоке.

Для получения дополнительной информации вы можете проверитьДокументация NSNotificationCenter.

Примечание. Этот код основан на том, что имелось в OP. Это может быть упрощено (вам не нужно отслеживать как «светлое», так и «темное» состояние, например, только одно).

 Andy Ibanez24 окт. 2018 г., 07:41
Да, вы правы. Починил это.
 Jaqueline26 нояб. 2017 г., 22:30
Большое вам спасибо за это! Похоже, это будет работать отлично! Я попробую это позже, когда у меня будет шанс, и я перезвоню вам, если у меня возникнут еще вопросы.
 Andy Ibanez24 окт. 2018 г., 08:04
Это просто материал, специфичный для кода оп. Он не нужен для реализации функции смены темного режима. Просто разберитесь в системе уведомлений и UserDefaults, и все готово.
 Andy Ibanez21 февр. 2018 г., 18:05
@WoodstockviewDidLoad вызывается до того, как ваша точка зрения станет видимой. Темный режим будет применен до того, как представление будет показано пользователю.
 Andy Ibanez26 нояб. 2017 г., 23:34
Это «специальная» функция, для которой не требуется ключевое слово «func». Так что в той же области, что и все ваши другие методы в классе.

один: используйте AppleUIAppearance прокси. Это работает очень хорошо, если ваше приложение очень согласованно использует цвета во всех ваших представлениях и элементах управления, и не очень хорошо, если у вас есть куча исключений. В этом случае я рекомендую использовать сторонний модуль, напримерSwiftTheme

 Jaqueline27 нояб. 2017 г., 02:04
Спасибо. Я посмотрю на это, когда буду за компьютером. И мое приложение остается в соответствии с цветами. Все в основном белое и черное, кроме изображений профиля пользователя и т. Д.

Ваш ответ на вопрос