SwiftUI - 如何从单独的类触发警报

Posted

技术标签:

【中文标题】SwiftUI - 如何从单独的类触发警报【英文标题】:SwiftUI - How to trigger an Alert from a seperate class 【发布时间】: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 进行交流。

有什么想法吗?

【问题讨论】:

【参考方案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

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

感谢您的意见。

【讨论】:

以上是关于SwiftUI - 如何从单独的类触发警报的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swiftui 上关闭应用程序时创建警报(不是通知)

SwiftUI:如何从 ViewModel 的更改中切换警报演示者

SwiftUI Alert 如何让它在一个简单的 if 语句中工作?

如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?

在视图外触发时如何绑定 SwiftUI.Alert 的呈现?

如何使用 SwiftUI 呈现警报