【发布时间】:2023-03-07 06:02:02
【问题描述】:
我在寻找什么
我正在尝试重新加载视图控制器中的所有视图,以在主题之间进行更改(类似于 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) 或任何算作崩溃的东西),或者在使用应用程序时重新加载它。
我尝试关闭然后重新加载视图控制器,如上面的代码所示。我正在重新加载的那个显示在基本视图控制器的顶部。
由于我正在使用情节提要,我怎样才能完成这项工作?
编辑 - 添加了我的明暗模式的图像以使我的问题更清晰:
【问题讨论】:
-
在你的 baseController 中创建主题更新函数并在everyoController 中覆盖该方法将 UI 更新逻辑放入该函数中,当设备摇晃时调用覆盖的方法......我已经这样做了
-
正如 Abu UI Hassan 所说,在每个控制器中的基本控制器覆盖中创建方法,将逻辑放在那里以进行主题更新。您必须使用 NotificationCenter 将消息广播到控制器必须更改主题的每个控制器。
-
这是一个很好的例子,展示了如何使用复合设计模式将主题应用于任何层次的视图。它也可以扩展到视图控制器refactoring.guru/design-patterns/composite/swift/…
标签: ios swift uiviewcontroller xcode-storyboard