我有一门叫启动的课。在此类中,我有许多在启动应用程序时从SceneDelegate调用的函数。

例如:

class Startup {

   func doThis() {

     print("I'm doing this")

   }
}


某一时刻,如果需要,它可以下载数据。发生这种情况时,我想触发一个带有 Activity 指示器的警报,以阻止用户输入该UI,直到一切完成为止。

我在ContentView中设置了所有 Activity 指示器警报,该警报在EnvironmentObject var Bool上触发。因此,要激活此UI阻止警报,我需要做的就是切换我的环境变量。

我遇到的问题是我无法从我的课堂内触发此环境变量。我尝试了以下方法:

当我把@EnvironmentObject var dataBusy: DataBusy并从函数dataBusy.isBusy = true中调用它,我得到了错误消息:

致命错误:未找到DataBusy类型的ObservableObject。

这表明我需要在实例化时将env对象推到类的环境中,但是,当我尝试这样做时,我得到:

元组类型'()'的值没有成员'environmentObject'

因此,我无法将此环境变量添加到此类对象中。

尝试使用:
@ObservedObject var dataBusy = DataBusy()

在我的课堂上,似乎没有出错,但切换此操作不会触发我的事件。

我想不出任何其他方法来从此启动类与View进行通信。

有任何想法吗?

最佳答案

以下代码有效,您会发现自己错过或误解的地方。

        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
                }
            }

        }

关于ios - SwiftUI-如何从单独的类触发警报,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58635354/

10-12 00:18
查看更多