Обновить состояние структуры экрана из SceneDelegate - PullRequest
1 голос
/ 12 февраля 2020

Я пришёл от реакции-натива и новичка в Swift и SwiftUI, и мне было любопытно, как выполнить действие и обновить состояние на указанном экране c, когда приложение возвращается на передний план. Я хочу проверить состояние уведомлений («разрешено», «отказано» и т. Д. c.) И обновить пользовательский интерфейс.

Это пример кода. Вот представление, которое я хочу обновить:

struct Test: View {
    @State var isNotificationsEnabled : Bool

    var body : some View {
        Toggle(isOn: self.isNotificationsEnabled) {
            Text("Notifications")
        }
    }

}

До сих пор я читал, что вам нужно отредактировать func sceneWillEnterForeground(_ scene: UIScene) внутри SceneDelegate.swift, но как же мне оттуда обновить состояние моей Test структуры? Я думаю, нам нужно какое-то глобальное состояние, но это всего лишь предположение.

Любой совет?

1 Ответ

1 голос
/ 12 февраля 2020

Вот самый простой подход

struct Test: View {
    @State private var isNotificationsEnabled : Bool

    private let foregroundPublisher = NotificationCenter.default.publisher(for: UIScene.willEnterForegroundNotification)

    var body : some View {
        Toggle(isOn: self.$isNotificationsEnabled) {
            Text("Notifications")
        }
        .onReceive(foregroundPublisher) { notification in
            // do anything needed here
        }
    }
}

Конечно, если в вашем приложении может быть несколько сцен, и вам необходимо как-то их дифференцировать, тогда потребуется более сложный вариант этого подхода, чтобы определить, какая сцена генерирует это уведомление. .

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