Что я ищу
Я пытаюсь перезагрузить все представления в моем контроллере представлений, чтобы переключаться между темами (аналогично тому, что делает Twitter
или Apple Maps
).
Как настроить мои разные темы
У меня есть тематические представления, настроенные так:
@IBDesignable
extension UIView {
@IBInspectable
var lightBackgroundColor: UIColor? {
set {
switch GEUserSettings.theme {
case .light: backgroundColor = newValue
case .dark: break
}
}
get {
return self.lightBackgroundColor
}
}
@IBInspectable
var darkBackgroundColor: UIColor? {
set {
switch GEUserSettings.theme {
case .light: break
case .dark: backgroundColor = newValue
}
}
get {
return self.darkBackgroundColor
}
}
}
Это позволяет мне в Main.storyboard
установить цвет фона темы light
и dark
, в зависимости от текущей темы. Мой эффект размытия фона исключен из этого, так как я не смог найти способ обновить style
в коде, поэтому он создан в viewDidLoad
.
Запуск темы от сотрясения устройства
Однако, когда я хочу сменить тему, я не уверен, как это сделать. Я хочу, чтобы вызвать это от встряхивания устройства, например, так:
override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
print("Shaken!")
let oppositeTheme: GEUserSettings.Theme = {
switch GEUserSettings.theme {
case .light: return .dark
case .dark: return .light
}
}()
GEUserSettings.theme = oppositeTheme
// My attempt to update the view controller to
// update the theme, which doesn't do anything.
dismiss(animated: true) {
UIApplication.shared.keyWindow?.rootViewController?.present(self, animated: true, completion: nil)
// Yes, the presenting is working, but the views don't change.
}
}
Каковы возможные решения?
Настройки вступают в силу, если приложение закрывается и перезапускается. Я мог бы либо принудительно закрыть приложение (не используя exit(0)
, либо что-либо, что считается крахом), либо перезагрузить его во время использования приложения.
Я попытался закрыть, а затем перезагрузить контроллер представления, как показано в коде выше. Тот, который я перезагружаю, представлен сверху основного контроллера представления.
Как я могу заставить это работать, когда я использую раскадровки?
Редактировать - Добавлено изображение моих светлых / темных режимов, чтобы прояснить мой вопрос: