在iOS13中Swift如何立即改变主题风格(User Interface Style)

How to change theme style (User Interface Style) immediately in Swift in iOS 13

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

应用程序具有用户可以设置显示主题的设置(浅色深色系统默认值) 目前,如果应用程序在用户选择主题后重新启动,它工作正常(我将此 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
   }
}

但我看到很多应用在用户设置主题样式后立即更改显示主题。

我认为只更改主题重启应用不是个好主意,用户设置主题样式后应立即更改主题。

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

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

我们可以通过设置overrideUserInterfaceStyle来立即改变用户界面风格。 我在用户可以 select 主题样式的地方添加了这段代码。

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

我希望这对其他人有帮助

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

您只需要使用 notification observer 模式调用用户交互代码或直接调用该函数。

但关键是要在那里访问可见的 window 和 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 以来,密钥 window 不再是 appDelegate 的一部分,您应该