8

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

应用程序具有用户可以设置显示主题(LightDarkSystem Default)的设置,如果在用户选择主题后应用程序重新启动,它当前工作正常(我将此布尔数据保存在 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 上设置用户界面样式来做到这一点,但导航栏和选项卡栏的外观不会改变。

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

4

2 回答 2

6

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

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

但关键是访问可见窗口和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 访问它

于 2019-10-28T10:16:39.333 回答
1

我们可以通过设置 overrideUserInterfaceStyle 立即更改用户界面样式。我添加了此代码,用户可以在其中选择主题样式。

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
   return
}
appDelegate.changeTheme(themeVal)

我希望这对其他人有帮助

于 2019-10-28T10:16:30.453 回答