swiftui - 场景相位意外变化
问题描述
我正在尝试将新的 App 协议用于新的 SwiftUI 应用程序,并且我需要在应用程序级别检测到 .background 的场景相位更改,以便将少量应用程序数据保存到 .plist 文件中。我不知道这是一个错误还是我做错了什么,但它没有按预期工作。一旦点击按钮,当场景仍处于活动状态时,scenePhase 将更改为 .background!为了展示这种奇怪行为的一个例子,我展示了这个简单的代码:
class DataModel: ObservableObject {
@Published var count = 0
}
@main
struct TestAppProtocolApp: App {
@Environment(\.scenePhase) private var scenePhase
@StateObject private var model: DataModel = DataModel()
var body: some Scene {
WindowGroup {
ContentView().environmentObject(model)
}
.onChange(of: scenePhase) { newScenePhase in
switch newScenePhase {
case .active:
print("Scene is active.")
case .inactive:
print("Scene is inactive.")
case .background:
print("Scene is in the background.")
@unknown default:
print("Scene is in an unknown state.")
}
}
}
}
struct ContentView: View {
@EnvironmentObject var model: DataModel
var body: some View {
VStack {
Button(action: { model.count += 1 }) {
Text("Increment")
}
.padding()
Text("\(model.count)")
}
}
}
当点击增量按钮时,scenePhase 变为 .background,然后,当 App 真正被发送到后台时,scenePhase 不会改变。
我发现将 .onChange(of: scenePhase) 移动到 View (ContentView) 可以正常工作,但 Apple 宣布您可以在 App 级别监控任何 scenePhase 更改,而这正是我在 View 级别不想要的。
解决方案
我也遇到了类似的问题,scenePhase 根本不工作,然后它工作了,但没有像预期的那样。尝试从您的财产中仅删除“@StateObject private”,您可能会得到其他结果。我希望新的测试版能解决这个问题。
推荐阅读
- haskell - -XStrict 在 GHC 中有什么作用吗?
- python-3.x - 从 Databricks 访问 ADLS Gen 2 存储
- python - Django 我如何编辑帖子?
- php - PHP shell_exec() wait and curl asynchronously and stay after exit()
- javascript - Is there a way to pause or delay an event handler in JavaScript?
- classnotfoundexception - Implements Jmeter java request : ClassNotFoundException
- android - 无法在 android 上使用 Videocapture() 读取视频文件
- c++ - 得到有符号整数溢出错误(c++)
- oracle - Add the data to the tables by using Oracle APEX
- javascript - Favicon won't load and throws error in console