SwiftUI - Как вызвать оповещение из отдельного класса - PullRequest
0 голосов
/ 31 октября 2019

У меня есть класс Startup. В этом классе у меня есть набор функций, которые я вызываю из SceneDelegate при запуске приложения.

например:

class Startup {

   func doThis() {

     print("I'm doing this")

   }
}

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

У меня все оповещение индикатора активности настроено вContentView, который запускается в EnvironmentObject var Bool. Поэтому все, что мне нужно сделать, чтобы активировать это предупреждение о блокировке пользовательского интерфейса, - это переключить () мой env var.

Проблема, с которой я столкнулся, заключается в том, что я не могу вызвать этот env var из своего класса. Я пробовал следующее:

Когда я помещаю @EnvironmentObject var dataBusy: DataBusy и вызываю его из функции: dataBusy.isBusy = true, я получаю сообщение об ошибке:

Неустранимая ошибка: НетObservableObject типа DataBusy найден.

Это указывает на то, что мне нужно поместить объект env в среду класса, когда он создается, однако, когда я пытаюсь это сделать, я получаю:

Значение типа кортежа '()' не имеет члена 'environmentObject'

Итак, я не могу добавить эту переменную env в этот объект класса.

Попытка использовать:

@ObservedObject var dataBusy = DataBusy()

В моем классе, похоже, нет ошибок, но переключение этого ничего не делает для запуска моего события.

Я не могуПодумайте о любом другом способе общения с моим View из этого класса запуска.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Следующий код работает, вы найдете то, что упустили или неправильно поняли.

        class Env:  NSObject,  ObservableObject{
            @Published var isEnabled = false
        }

        struct AlertTest: View {

            @EnvironmentObject var envObject: Env

            var body: some View {
                Text("board").alert(isPresented: $envObject.isEnabled) { () -> Alert in
                    return Alert(title: Text("hello"))
                }
        }
        }


        //Scene Delegate
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

            let m = Env()
            let contentView =  AlertTest().environmentObject(m)

            if let windowScene = scene as? UIWindowScene {
                let window = UIWindow(windowScene: windowScene)
                window.rootViewController = UIHostingController(rootView: contentView)
                self.window = window
                window.makeKeyAndVisible()
            }

            Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { (Timer) in
                DispatchQueue.main.async {
                    m.isEnabled = true
                }
            }

        }
0 голосов
/ 31 октября 2019

Понял ..

Ответ E.Coms очень хороший, однако я вызывал функцию, которая будет отвечать за это действие изнутри другой функции, внутри другой функции из этого другого класса, а не напрямуюот делегата сцены.

Чтобы получить его, мне нужно было передать DataBusy объект dataBusy от моего делегата сцены моему классу func в качестве параметра:

//Scene Delegate:

let dataBusy = DataBusy() //my Observed Object Class
let myClass = MyClass();  //instantiate my class 

myClass.myFunc(data: dataBusy) //pass the object through to the class function

Таким образом, когда в моей функции класса появляется время, я могу переключить переменную, и она все прекрасно работает.

Спасибо за ваш вклад.

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