Как я могу изменить цвет текста строки состояния для каждого представления в SwiftUI? - PullRequest
2 голосов
/ 26 мая 2020

Я ищу способ изменить текст цвет строки состояния, который позволяет использовать другой цвет текста для каждого представления.

Я видел это 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, либо используют раскадровки и несколько контроллеров, что я не использую.

1 Ответ

0 голосов
/ 10 июня 2020

В вашем SceneDelegate вы вводите StatusBarTextColor() в представление Home. Однако вы объявили EvironmentObject в Controller.

...