首页 > 解决方案 > 在视图控制器的 SwiftUI 视图中从视图控制器更改状态栏颜色

问题描述

我在一些 UIKit 代码之间有一些 SwiftUI,可以很好地UIHostingController在一端和UIViewControllerRepresentable另一端启动东西,但我想控制状态栏颜色而不更改视图控制器,他们不应该知道是什么启动了它们.

视图控制器像往常一样使用preferredStatusBarStyle和。setNeedsStatusBarAppearanceUpdate我们不在应用程序中使用暗模式,因此该模式已被禁用。

我有一个子类UIHostingController,我可以使用它来设置 SwiftUI 代码的状态栏颜色referredStatusBarStyle等。

public class ContentHostingController: UIHostingController<MySwiftUIView> {
  private var currentStatusBarStyle: UIStatusBarStyle = .default
  public override var preferredStatusBarStyle: UIStatusBarStyle {
    currentStatusBarStyle
  }
  public func setStatusBarStyle(_ style: UIStatusBarStyle) {
    self.currentStatusBarStyle = style
    self.setNeedsStatusBarAppearanceUpdate()
  }
}

但是对于通过UIViewControllerRepresentableSwiftUI 呈现的视图控制器,我不确定使用preferredStatusBarStyleand的好方法setNeedsStatusBarAppearanceUpdate

在 SwiftUI 中使用视图声明式向下(向上?)堆栈并抓取它是很棘手的,preferredStatusBarStyle但它应该是可能的。

但是当视图控制器调用它时触发setNeedsStatusBarAppearanceUpdateContentHostingController是否应该被调配?

我不想向视图控制器添加通知,因为我希望能够在不考虑启动它们的框架的情况下构建它们。

这是一种层次结构

UIViewController (root)
  ContentHostingController (UIHostingController subclass)
    MySwiftUIView
      UIViewControllerRepresentable
        UIViewController (child)

标签: iosswiftswiftuiuikit

解决方案


推荐阅读