我正在使用Swift 5.1和Xcode 11.1,目前已经完成了黑暗模式设计。
应用程序已进行设置,用户可以在其中设置显示主题(浅,深色,系统默认),并且如果应用程序在重启后重新启动,则目前可以正常使用用户选择主题(我将这些布尔数据保存在UserDefaults中,并在App启动时在AppDelegate文件中设置UIAppearance)
这是我的代码
if #available(iOS 13.0, *) {
switch AppState.appThemeStyle {
case "dark":
window?.overrideUserInterfaceStyle = .dark
break
case "light":
window?.overrideUserInterfaceStyle = .light
break
default:
window?.overrideUserInterfaceStyle = .unspecified
}
}
但是我看到许多应用在用户设置主题样式后立即更改显示主题。
我认为重启应用程序不是一个好主意,因为仅更改主题并且用户设置主题样式后应立即更改主题。
我试图通过设置基本的viewcontroller并在ViewWillAppear上设置用户界面样式来做到这一点,但是导航栏和Tab栏的外观没有改变。
有人可以告诉我如何处理吗? 谢谢。
答案 0 :(得分:2)
此代码是即时代码,无需重新启动应用程序!
您只需要在与通知观察者模式进行用户交互时调用代码,或直接调用如下函数:
// Because you are using AppDelegate for this: (But it is going to be deprecated. read the following Note)
(UIApplication.shared.delegate as! AppDelegate).myFunctionThatChangesTheUserInterfaceStyle()
还请注意:自iOS 13起,键窗口不再是appDelegate的一部分,您应该access it from sceneDelegate
答案 1 :(得分:1)
我们可以通过设置overlayUserInterfaceStyle来立即更改用户界面样式。 我添加了此代码,用户可以在其中选择主题样式。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
我希望这会帮助其他人