viewDidAppear,而且当应用程序从后台返回时

Posted

技术标签:

【中文标题】viewDidAppear,而且当应用程序从后台返回时【英文标题】:viewDidAppear, but also when app returns from background 【发布时间】:2016-05-13 20:49:04 【问题描述】:

我有一个 UIView(“内容”),它是一个带有大红点的白色视图。

当应用首次启动时,我希望点淡入(仅半秒)。

每当该视图再次出现时(因此,用户已经在某个其他屏幕上并返回该屏幕),我希望该点淡入。

目前没有问题

override func viewDidAppear(animated: Bool)
    
    content.fadeIn()
    

但是,每当应用程序进入后台时,当用户将其置于前台时(假设视图正在显示),我希望它淡入。我这样做

func weAreActive(notification: NSNotification) content.fadeIn()
func weAreNotActive(notification: NSNotification) content.alpha = 0;

override func viewWillAppear(animated: Bool)
    
    super.viewWillAppear(animated)
    NSNotificationCenter.defaultCenter().addObserver(
        self, selector: #selector(weAreActive(_:)),
        name: UIApplicationDidBecomeActiveNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(
        self, selector: #selector(weAreNotActive(_:)),
        name: UIApplicationDidEnterBackgroundNotification, object: nil)
    

override func viewDidDisappear(animated: Bool)
    
    super.viewDidDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
    

第一个问题:我担心使用 viewWillAppear/viewDidDisappear pair 来注册/取消注册。我错了吗?我应该使用另一个pair——也许是viewDidAppear/somethingElse?还是?

第二个问题:我担心viewDidAppear 和 'weAreActive` 同时触发(例如,在应用首次启动时)

这似乎不优雅。有没有更好的方法来寻找“这个视图真正出现”,原因包括所有启动、唤醒和常规 viewDidAppear?

【问题讨论】:

我可能更喜欢viewDidAppearviewWillDisappear。真的没有比这更好的事件了。大多数时候,当您从后台返回时,您不需要更改 UI。用户通常希望尽可能快地工作,有时他们可以看到系统截取的先前 UI 的屏幕截图,因此动画不是一个好的解决方案。 嗨@Sulthan,谢谢,您喜欢viewDidAppearviewWillDisappear 注册/注销的原因是什么? 对于这个通知,它可能并不重要,但通常我不想在视图出现或消失时收到通知,这就是为什么我更喜欢viewDidAppear 【参考方案1】:

第一个问题: viewDidAppear 和 viewDidDisappear 将是注册/取消注册通知的最佳位置,因为您在第二个问题中概述了原因(在第一次启动时,注册 UIApplicationDidBecomeActiveNotification 在 vi​​ewWillAppear 中会导致重复动画。

编辑:如果您只是检查应用何时从后台返回,那么您应该使用 UIApplicationWillEnterForegroundNotification 然后您可以使用 viewDidAppear 或 viewWillAppear无需担心重复调用。

viewDidAppear 和 viewWillDisappear 是运行动画的最佳位置,因此用户可以实际看到它们。

第二个问题: viewDidAppear/viewWillAppear 在应用从后台返回时不会被调用,因此您不必担心它们会同时被调用。

在某些情况下,拥有一个整体的“viewHasDefinitelyAppeared”会很好,但在很多情况下您希望它们分开,并非所有应用都希望用户在从后台返回时看到动画,这是不可能的如果所有方法合二为一。

【讨论】:

没问题乔,(1)在您的代码示例中,我会说您拥有最明智的方式。如果您要在每次用户离开视图时显示动画,那么我建议将其放入 Will 消失。作为最后发生的事情,您取消注册通知是有意义的。 (2) 我相信你不必担心他们中的任何一个没有被调用。如果他们没有被调用,那么这就是 Apple 的问题。无论是否显示屏幕,都应该调用所有 4 个。我听到你在说最好的一对,但这真的取决于你需要做什么。 (i) 不抱歉,我没有 Apple 文档,它遇到了几次该问题,想知道为什么当我切换回我的应用程序时我的 viewDidAppear 不起作用。 (ii) 我认为你在这里仍然是安全的,因为 viewWillAppear 不会被足够早地调用来注册第一次启动的通知。我只是在设置一个测试来确认这一点,但我认为你不必担心双重调用。 我的立场是正确的, viewWillAppear 被调用得足够早,并且确实会导致通知在开始时被调用。我将相应地编辑我的答案。 ** UIApplicationWillEnterForegroundNotification** 是一个特别好的提示 - 谢谢!

以上是关于viewDidAppear,而且当应用程序从后台返回时的主要内容,如果未能解决你的问题,请参考以下文章

为啥后台和重新打开应用程序不调用 viewDidAppear?

从后台调用应用程序时调用方法

何时实际调用 viewDidLoad / viewDidAppear? [复制]

Grand Central Dispatch、viewWillAppear、viewDidAppear 执行顺序混乱

当不再需要时,JVM 是不是会将空闲内存返还给操作系统?

当应用程序进入前台时,哪个View Controller处于活动状态?