【问题标题】:How to Listen to new SwiftUI Lifecycle Methods in iOS 14?如何在 iOS 14 中监听新的 SwiftUI 生命周期方法?
【发布时间】:2021-03-31 06:49:55
【问题描述】:

为了减少样板代码,我想使用 iOS 14 中新的 SwiftUI Lifecycle 来替换 AppDelegate 和 SceneDelegate。但是如何监听 SceneDelegate 生命周期方法呢?

例如:

当应用程序转换到后台时,如何在应用程序的托管对象上下文中保存更改?

import SwiftUI
    
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    let persistenceController = PersistenceController.shared

    ...

    func sceneDidEnterBackground(_ scene: UIScene) {
        persistenceController.saveContext()
    }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您可以通过 全局环境变量 及其属性“.scenePhase”的通知来获取 APP LAUNCHING STATES(以前在 AppDelegate 中完成),如下所示:

    // CREATE SOME APP LAUNCHING STATES LIKE WE HAD IN APPDELEGATE
    
    @main
    struct NewAppLifeCycleApp: App {
    
      @Environment(\.scenePhase) var scenePhase
      
      var body: some Scene {
        WindowGroup {
          ContentView()
        }
        .onChange(of: scenePhase) { newScenePhase in
          switch newScenePhase {
          case .active:
            print("App is active")
          case .inactive:
            print("App is inactive")
          case .background:
            print("App is in background")
          @unknown default:
            print("Interesting: Unexpected new value.")
          }
        }
      }
    }
    

    如果您想在应用的早期阶段集成一些代码,您只需添加一个init-function:

    // EASY WAY TO INTEGRATE SOME CODE INTO 
    // VERY EARLY STAGE OF APP INIT
    
    @main
    struct ColorsApp: App {
    
      // Add an init method to add code
      init() { print("My App is starting") }
      
      var body: some Scene {
        WindowGroup {
          ContentView()
        }
    }
    

    【讨论】:

      【解决方案2】:

      我可以帮助自己。

      要监听生命周期更新,就像我们在 SceneDelegate 中所做的那样,scenePhase 枚举器保存场景的当前状态。我们可以将其用作 Environment-Property-Wrapper 并监听状态变化:

      import SwiftUI
      
      @main
      struct MyiOS14App: App {
          
          @Environment(\.scenePhase) private var scenePhase
      
          let persistenceController = PersistenceController.shared
          
          var body: some Scene {
      
              WindowGroup {
                  ContentView()
              }
              .onChange(of: scenePhase) { (phase) in
                  switch phase {
                  case .active:
                      break
      
                  case .background:
                      //perform cleanup
                      break
      
                  case .inactive:
                      persistenceController.saveContext()
                      
                  @unknown default:
                      fatalError()
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-15
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多