从后台打开应用时,ViewDidAppear 不会被调用


在 Swift 中,当应用程序从后台打开时,viewDidAppear 方法不会被调用。在这种情况下,您必须在 AppDelegate 中使用 applicationWillEnterForeground 方法。在这篇文章中,您将看到一个关于如何在从后台打开应用程序时执行操作的示例。

方法

如果您从后台打开一个应用程序,它应该在呈现视图之前调用应用程序委托的 applicationWillEnterForeground 方法。但是,如果视图控制器的视图已在屏幕上,或者应用程序尚未完全终止,则可能不会调用视图控制器的 viewDidAppear 方法。

如果您希望确保每次视图控制器的视图出现时都调用 viewDidAppear,则可以将要在该方法中执行的代码放在一个单独的方法中,并从 viewDidAppear 和 applicationWillEnterForeground 两个方法中调用它。这样,您的代码将在视图控制器的视图出现在屏幕上以及应用程序从后台返回时都执行。

示例

当然,以下是如何实现此方法的示例:

import UIKit
class TestController: UIViewController {
    
   override func viewDidLoad() {
      super.viewDidLoad()
      initialSetup()
   }
    
   override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
   }
    
   private func initialSetup() {
        
      view.backgroundColor = .white
      navigationItem.title = "Background Call"
        
      NotificationCenter.default.addObserver(self, selector: #selector(refreshData), name: .init("RefreshData"), object: nil)
   }
    
   @objc private func refreshData() {
      print("You need to refresh the data...")
        
      // Write code here to refresh the data
   }
}

运行上述代码后,您会发现当您从后台打开应用程序时,viewDidAppear 方法不会被调用。为了执行它,您可以在 AppDelegate 中实现 applicationWillEnterForeground,如下所示:

import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
   var window: UIWindow?
    
   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
      // write code here to set initial view controller programatically
      self.window = UIWindow(frame: UIScreen.main.bounds)
      let navigation = UINavigationController(rootViewController: TestController())
      self.window?.rootViewController = navigation
      self.window?.makeKeyAndVisible()
        
      return true
   }
    
   func applicationWillEnterForeground(_ application: UIApplication) {
      NotificationCenter.default.post(name: .init("RefreshData"), object: nil)
   }
}

这样,refreshData() 方法将在视图控制器的视图出现在屏幕上以及应用程序从后台返回时都被调用。

请注意,applicationWillEnterForeground 是应用程序委托的方法,而不是视图控制器的方法,因此您需要在应用程序委托中实现它,并在视图控制器实例上调用相应的方法。

结论

总之,iOS 中视图控制器的 viewDidAppear 方法并不总是会在应用程序从后台返回时被调用。为了确保您的代码在应用程序从后台返回和视图控制器的视图出现在屏幕上时都执行,您可以定义一个单独的方法来保存要执行的代码,并从 viewDidAppear 和 applicationWillEnterForeground 两个方法中调用该方法。这种方法对于刷新数据、跟踪分析或处理推送通知等用例非常有用。

更新于:2023年5月4日

1K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告