【问题标题】:viewDidAppear, but also when app returns from backgroundviewDidAppear,而且当应用程序从后台返回时
【发布时间】: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

标签: ios swift uiview nsnotificationcenter uiapplicationdelegate


【解决方案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** 是一个特别好的提示 - 谢谢!
猜你喜欢
  • 2013-03-29
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多