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 中隐藏/显示警报?