我使用的是Swift 5.1和Xcode 11.1,目前我已经完成了黑暗模式的设计。
应用程序有设置,用户可以在其中设置显示主题(浅色、深色和系统默认(,如果用户选择主题后应用程序重新启动,当前它可以正常工作(我将此布尔数据保存在UserDefaults中,并在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
}
}
但我可以看到,许多应用程序在用户设置主题样式后立即更改显示主题。
我认为重启应用程序只是改变主题并不是一个好主意,用户设置主题样式后主题应该立即改变。
我试图通过在ViewWillAppear上设置基本视图控制器和用户界面样式来做到这一点,但导航栏&选项卡栏外观不变。
有人能告诉我怎么处理吗?谢谢
此代码是即时的,无需重新启动应用程序!
您只需要使用通知观察器模式在用户交互时调用代码,或者直接调用函数。
但重点是访问可见窗口和那里的overrideUserInterfaceStyle
。因此,例如,您可以从任何可见的view
设置它,如:
view.window?.overrideUserInterfaceStyle = .dark
不推荐但工作方法
// 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的一部分,您应该从sceneDelegate 访问它
我们可以通过设置overrideUserInterfaceStyle立即更改用户界面样式。我添加了这个代码,用户可以在其中选择主题样式。
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.changeTheme(themeVal)
我希望这将帮助其他