Вручную установите светлый / темный режим в SwiftUI и сохраните выбор пользователя - PullRequest
0 голосов
/ 10 апреля 2020

Я нашел решение вручную установить светлый / темный режим в приложении swiftui в другом потоке, найденном здесь { ссылка } в основном это работает, но есть две проблемы.

  1. Выбор пользователя не сохраняется навсегда.

  2. Я бы хотел, чтобы по умолчанию был выбран темный режим, поэтому приложение первоначально будет отображаться в темном режиме, если пользователь имеет Система настроена на светлый или темный режим.

В настоящий момент эта реализация немного ошибочна, потому что, если пользователь открывает приложение в светлом режиме и нажимает тумблер. Первый раз, когда они нажмут на выключатель, ничего не будет сделано. Им придется еще два раза нажать на переключатель, чтобы запустить didSet, чтобы перевести приложение в темный режим, и даже тогда выбор не будет сохранен.

Несколько других потоков спрашивают о реализации темного режима, но большая часть работы с UIKit и нитью, на которую я ссылался выше, была единственным решением, которое я смог получить, работая в основном на swiftui. Можно ли изменить это решение для решения двух затронутых мной проблем?

1 Ответ

2 голосов
/ 11 апреля 2020

Здесь возможен подход (по-простому, вы можете найти здесь в обертке свойств SO по умолчанию и использовать его для лучшего стиля, но идея для достижения вашей цели та же)

Протестировано с Xcode 11.4 / iOS 13,4

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    private(set) static var shared: SceneDelegate?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        Self.shared = self

        let contentView = ContentView()

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)

            // restore from defaults initial or previously stored style
            let style = UserDefaults.standard.integer(forKey: "LastStyle")
            window.overrideUserInterfaceStyle = (style == 0 ? .dark : UIUserInterfaceStyle(rawValue: style)!)

            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

   ...
}


struct ContentView: View {
    var body: some View {
         // manipulate with style directly in defaults
         Toggle(isOn: Binding<Bool>(
            get: { UserDefaults.standard.integer(forKey: "LastStyle") !=
                        UIUserInterfaceStyle.light.rawValue },
            set: {
                SceneDelegate.shared?.window!.overrideUserInterfaceStyle = $0 ? .dark : .light
                UserDefaults.standard.setValue($0 ? UIUserInterfaceStyle.dark.rawValue : UIUserInterfaceStyle.light.rawValue, forKey: "LastStyle")
            }
         )) {
             Text("is Dark")
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...