【发布时间】:2020-05-26 19:30:31
【问题描述】:
我正在寻找一种方法来更改状态栏的 文本 颜色,以便为每个视图使用不同的文本颜色。
我见过this Q&A,但这不是我要找的。我不是在寻找只允许所有视图使用一种状态栏文本颜色的解决方案。我想为每个视图更改状态栏文本颜色。例如,一个视图可能有深色背景,因此我需要浅色文本。我可能会导航到具有浅色背景的另一个视图,所以现在我需要深色文本。建议的重复答案只返回.lightContent,这意味着当我移动到不同的视图时,状态栏文本颜色无法动态变化。
This answer here 在我的机器上工作,但性能不佳。它下面的评论证实了这一点。滞后是不可接受的,所以这个解决方案不好。
到目前为止我看到的其他解决方案会导致此特定错误:
Compiling failed: extensions of generic classes cannot contain '@objc' members
我还尝试在自定义控制器中使用环境对象:
import SwiftUI
/// Allows for the status bar colors to be changed from black to white on the dark gray title bar
class Controller<ContentView> : UIHostingController<ContentView> where ContentView : View {
@EnvironmentObject var statusBarTextColor: StatusBarTextColor
lazy var isDark: Bool = self.statusBarTextColor.isDark
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .darkContent
}
}
这会导致错误:
Thread 1: Fatal error: No ObservableObject of type StatusBarTextColor found. A View.environmentObject(_:) for StatusBarTextColor may be missing as an ancestor of this view.
在我的 SceneDelegate 文件中,我确实指定了 StatusBarTextColor environmentObject:
window.rootViewController = Controller(
rootView: Home()
.environmentObject(PostData())
.environmentObject(CardPosition())
.environmentObject(StatusBarTextColor())
)
这就是 ObservableObject 本身:
import Combine
import SwiftUI
final class StatusBarTextColor: ObservableObject {
@Published var isDark: Bool = true
}
如果我猜测为什么这不起作用,我会说这是因为控制器在 StatusBarTextColor 可用之前被初始化。
我越是研究这个问题,就越觉得没有解决办法。我几乎浏览了有关该主题的所有文章、答案和视频。他们要么使用一个控制器只返回 .lightContent,要么使用故事板和多个控制器,这不是我正在使用的。
【问题讨论】:
标签: ios swift swiftui statusbar