我有一门叫启动的课。在此类中,我有许多在启动应用程序时从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/