Вид будет отображаться, не срабатывает, когда мы закрываем наложение настроек уведомлений

У меня есть контроллер представления, когда я нажимаю кнопку, я перенаправляю пользователя в настройки приложения.

       UIApplication.openApplicationSettings()

Когда я возвращаюсь из настроек приложения в приложение, метод viewwillappear не запускается.

или есть ли какой-либо другой метод, который позволит нам узнать, что настройки приложения закрыты и пользователь видит экран прямо сейчас.

2 ответа

Решение

Вы должны использовать события жизненного цикла приложения (SceneDelegate / AppDelegate), а не просматривать события жизненного цикла контроллера ( viewDidLoad, viewDidAppear, так далее). sceneDidBecomeActive(_:) должно подойти для ваших целей - для iOS 13+ вы должны использовать SceneDelegate для прослушивания фаз сцены, например, переход к настройкам (переход в неактивное состояние), а затем возврат (повторное включение).

      /// SceneDelegate.swift
func sceneDidBecomeActive(_ scene: UIScene) {
    // Called when the scene has moved from an inactive state to an active state.
    // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.

    /// your code here
}

Если вы хотите послушать sceneDidBecomeActive прямо в вашем контроллере представления, попробуйте прослушать didActivateNotification уведомление.

      class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver( /// add observer
            self,
            selector: #selector(activated),
            name: UIScene.didActivateNotification,
            object: nil
        )
    }
    
    @objc func activated() {
        print("View controller is back now")
    }
}

Подпишитесь на следующие события appdelegate

      applicationDidBecomeActive 

или

      applicationWillEnterForeground

В ViewDidLoad используйте нижеприведенный фрагмент кода

      NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

и используйте метод ниже

        @objc func applicationDidBecomeActive(notification: NSNotification) {
        updateTableUI()
    }

Удалить наблюдателя

         deinit {
           NSNotificationCenter.defaultCenter().removeObserver(self)
   }