Я ищу способ изменить текст цвет строки состояния, который позволяет использовать другой цвет текста для каждого представления.
Я видел это Q&A , но это не то, что я ищу. Я не ищу решений, которые позволяют использовать только один цвет текста строки состояния для всех представлений. Я хочу изменить строку состояния текст цвет для каждого вида . Например, у одного вида может быть темный фон, поэтому мне нужен светлый текст. Я мог бы перейти к другому виду со светлым фоном, поэтому теперь мне нужен темный текст. Предлагаемый дублированный ответ возвращает только .lightContent , что означает, что цвет текста строки состояния не может динамически меняться при переходе в другое представление.
Этот ответ здесь работает на моей машине , но не работает . Комментарий под ним подтверждает это. Задержка неприемлема, поэтому это решение не подходит.
Другие решения, которые я видел до сих пор, вызывают эту конкретную ошибку:
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:
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, либо используют раскадровки и несколько контроллеров, что я не использую.