场景相位意外改变
scenePhase changing unexpectedly
我正在尝试将新的 App 协议用于新的 SwiftUI 应用程序,我需要在应用程序级别检测 scenePhase 更改为 .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) 移动到视图 (ContentView) 工作正常,但 Apple 宣布您可以在应用程序级别监视任何 scenePhase 更改,这是我真正不想要的查看级别。
我也有类似的问题,scenePhase 根本不工作,然后它工作但没有达到预期。尝试从 属性 中仅删除“@StateObject private”,您可能会得到其他结果。我希望新的测试版能解决这个问题。
顺便说一下,在 SwiftUI 2+ 中保存少量 App-wide 数据的推荐方法是通过 @AppStorage 属性 包装器,它本身依赖于 UserDefaults。以下是我们如何检测第一次启动并切换标志:
struct MainView: View {
@AppStorage("isFirstLaunch") var isFirstLaunch: Bool = true
var body: some View {
Text("Hello, world!")
.sheet(isPresented: $isFirstLaunch, onDismiss: { isFirstLaunch = false }) {
Text("This is the first time app is launched. The sheet will not be shown again once dismissed.")
}
}
}
Xcode12 beta 6 似乎解决了这个问题。现在它按预期工作了。
我正在尝试将新的 App 协议用于新的 SwiftUI 应用程序,我需要在应用程序级别检测 scenePhase 更改为 .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) 移动到视图 (ContentView) 工作正常,但 Apple 宣布您可以在应用程序级别监视任何 scenePhase 更改,这是我真正不想要的查看级别。
我也有类似的问题,scenePhase 根本不工作,然后它工作但没有达到预期。尝试从 属性 中仅删除“@StateObject private”,您可能会得到其他结果。我希望新的测试版能解决这个问题。
顺便说一下,在 SwiftUI 2+ 中保存少量 App-wide 数据的推荐方法是通过 @AppStorage 属性 包装器,它本身依赖于 UserDefaults。以下是我们如何检测第一次启动并切换标志:
struct MainView: View {
@AppStorage("isFirstLaunch") var isFirstLaunch: Bool = true
var body: some View {
Text("Hello, world!")
.sheet(isPresented: $isFirstLaunch, onDismiss: { isFirstLaunch = false }) {
Text("This is the first time app is launched. The sheet will not be shown again once dismissed.")
}
}
}
Xcode12 beta 6 似乎解决了这个问题。现在它按预期工作了。