【问题标题】:SwiftUI - How to trigger an Alert from a seperate classSwiftUI - 如何从单独的类触发警报
【发布时间】:2019-10-31 00:22:28
【问题描述】:

我有一个名为 Startup 的课程。在这个类中,我有一堆函数,我在应用程序启动时从 SceneDelegate 调用它们。

例如:

class Startup {

   func doThis() {

     print("I'm doing this")

   }
}

如有必要,它可能会在某一时刻下载数据。发生这种情况时,我想触发一个带有活动指示器的警报,以阻止用户输入 UI,直到事情完成。

我在 ContentView 中设置了活动指示器警报,它在 EnvironmentObject var Bool 上触发。所以我需要做的就是激活这个 UI 阻塞警报 totoggle() 我的环境变量。

我遇到的问题是我无法从我的班级中触发这个环境变量。我尝试了以下方法:

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

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

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

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

所以,我不能将此环境变量添加到此类对象中。

尝试使用:

@ObservedObject var dataBusy = DataBusy()

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

我想不出任何其他方式可以通过这个启动课程与我的 View 进行交流。

有什么想法吗?

【问题讨论】:

    标签: ios swift xcode swiftui


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答!我认为的问题是切换变量的调用不在我的sceneDelegate中,它在另一个类的函数中。该类是从场景委托中调用的,并以愉快的方式检查更新。当找到一个时,这就是触发它的地方。不能从第三个外部类调用它...
    【解决方案2】:

    知道了..

    E.Coms 的回答非常好,但是,我在另一个函数中调用了负责此操作的 func,在另一个类的另一个函数中,而不是直接从场景委托中调用。

    要获得它,我必须将场景委托中的 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
    

    这样,当我的类函数中出现时间时,我可以切换变量并且一切正常。

    感谢您的意见。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多