【问题标题】:View will appear is not firing when we dismiss notification settings overlay当我们关闭通知设置覆盖时,视图将不会触发
【发布时间】:2021-11-05 10:13:31
【问题描述】:

点击按钮时,我有一个视图控制器,我将用户带到应用设置。

 UIApplication.openApplicationSettings()

当我从 appsettings 回到 app 时, viewwillappear 方法不会触发。

或者是否有任何其他方法可以让我们知道 appsettings 已关闭并且用户现在正在查看屏幕。

【问题讨论】:

    标签: ios application-settings viewwillappear viewwilldisappear viewcontroller-lifecyle


    【解决方案1】:

    订阅以下 appdelegate 事件

    applicationDidBecomeActive 
    

    applicationWillEnterForeground
    

    在 ViewDidLoad 中使用下面的代码 sn-p

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

    并使用下面的方法

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

    移除观察者

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

    【讨论】:

    • 我必须使用通知订阅吗?
    • 现在为您的查询更新了答案
    • 这也有效。你能举个删除通知的例子吗?
    • 更新了答案
    • @RaviMan NSNotificationCenter.defaultCenter() 是旧的,在 Swift 5 中是 NotificationCenter.default
    【解决方案2】:

    您应该使用应用程序生命周期事件(SceneDelegate/AppDelegate),而不是查看控制器生命周期事件(viewDidLoadviewDidAppear 等)。 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")
        }
    }
    

    【讨论】:

    • 我可以直接在 viewcontroller 上使用 sceneDidBecomeActive 还是必须寻找通知?
    • @DCT 是的,您可以根据需要使用didActivateNotification 通知。查看我的编辑
    • 谢谢它的工作。但是我如何删除观察者?
    • @DCT 不需要,它是自动的。但是如果你真的想,把它放在deinit {}里面。
    • 你能举个例子来删除它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多