当从后台打开应用程序时,调用哪个UIViewController方法?

10
有没有方便的方法可以确定视图是否从处于后台模式的应用程序中加载?
在3.X版本中,我会依赖viewDidLoad进行一些初始化等操作,但是对于4.X版本来说并非如此,因为您不能依赖viewDidLoad方法被调用。
我想避免在appdelegate中添加额外的标志来检测这一点,我宁愿在UIViewController中使用可靠的方法来处理此问题,但是似乎在UIViewController的生命周期中找不到任何有用的方法。
有什么想法吗?您如何处理这种情况?
4个回答

8

Swift 5

订阅通知


       NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

        @objc func appMovedToForeground() {
            //Your code here
        }

移除通知


    override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)

            NotificationCenter.default.removeObserver(self)
    } 


3

UIViewController的生命周期中没有方法会在将应用从后台切换到前台时被调用。

如果您希望此事件触发特定的代码块,则需要为名为Notification.Name.UIApplicationWillEnterForeground的通知添加观察者。以下是一个示例:

NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)

@objc func appMovedToForeground() {
    //Your code here
}

记住,您需要删除观察者以防止其在整个应用程序中触发。


0

Combine 的方法应该是:

private var cancellables: Set<AnyCancellable> = []

NotificationCenter.default
            .publisher(for: UIApplication.willEnterForegroundNotification, object: nil)
            .sink { [weak self] _ in
                print("app just returned to the foreground")
            }
            .store(in: &cancellables)

-7
- (void)viewWillAppear:(BOOL)animated

不是

- (void)viewDidLoad

应用程序委托方法

- (void)applicationWillEnterForeground:(UIApplication *)applicationUIApplicationDelegate

将在应用程序进入前台后被调用,尽管您可以在任何视图中添加一个观察者来监听UIApplicationWillEnterForegroundNotification


是的,我知道viewWillAppear会被调用,正如它的名字所暗示的那样。但是,我不能仅仅依赖于这个方法来确定行为,因为当从堆栈中弹出视图以显示我们正在讨论的视图时,框架也会调用它。如果我的原始帖子没有表达清楚,那么很抱歉。 - Kaspa
39
@Kaspa - 实际上,当从后台返回时,viewWillAppear不会被调用。 (https://dev59.com/1G435IYBdhLWcg3wrSFB) - Barney Mattox
viewWillAppear不会被调用。 - quantumpotato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接