如何在 iOS 13 的 Swift 中立即更改主题样式(用户界面样式)

Mob*_*tar 7 ios swift ios-darkmode

我正在使用 Swift 5.1 和 Xcode 11.1,目前我已经完成了暗模式设计。

应用程序设置了用户可以设置显示主题(LightDarkSystem Default),目前如果应用程序在用户选择主题后重新启动,它可以正常工作(我将此 bool 数据保存在 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
   }
}
Run Code Online (Sandbox Code Playgroud)

但是我可以看到许多应用程序在用户设置主题样式后立即更改显示主题。

我认为仅更改主题而重新启动应用程序并不是一个好主意,并且在用户设置主题样式后应立即更改主题。

我试图通过在 ViewWillAppear 上设置基本视图控制器并设置用户界面样式来做到这一点,但导航栏和标签栏的外观没有改变。

谁能告诉我如何处理这个问题?谢谢。

Moj*_*ini 6

此代码是即时的,无需重新启动应用程序!

您只需要在用户与通知观察者模式交互时调用代码或直接调用该函数。

但重点是访问可见窗口和overrideUserInterfaceStyle那里。因此,例如,您可以从任何可见的位置进行设置,view例如:

view.window?.overrideUserInterfaceStyle = .dark
Run Code Online (Sandbox Code Playgroud)

已弃用但有效的方法

// Because you are using AppDelegate for this: (But it is going to be deprecated. read the following Note)
(UIApplication.shared.delegate as! AppDelegate).myFunctionThatChangesTheUserInterfaceStyle()
Run Code Online (Sandbox Code Playgroud)

请注意,从 iOS 13 开始,关键窗口不再是 appDelegate的一部分,您应该从 sceneDelegate 访问它