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?
【问题讨论】:
我可能更喜欢viewDidAppear
和viewWillDisappear
。真的没有比这更好的事件了。大多数时候,当您从后台返回时,您不需要更改 UI。用户通常希望尽可能快地工作,有时他们可以看到系统截取的先前 UI 的屏幕截图,因此动画不是一个好的解决方案。
嗨@Sulthan,谢谢,您喜欢viewDidAppear
和viewWillDisappear
注册/注销的原因是什么?
对于这个通知,它可能并不重要,但通常我不想在视图出现或消失时收到通知,这就是为什么我更喜欢viewDidAppear
。
【参考方案1】:
第一个问题: viewDidAppear 和 viewDidDisappear 将是注册/取消注册通知的最佳位置,因为您在第二个问题中概述了原因(在第一次启动时,注册 UIApplicationDidBecomeActiveNotification 在 viewWillAppear 中会导致重复动画。
编辑:如果您只是检查应用何时从后台返回,那么您应该使用 UIApplicationWillEnterForegroundNotification 然后您可以使用 viewDidAppear 或 viewWillAppear无需担心重复调用。
viewDidAppear 和 viewWillDisappear 是运行动画的最佳位置,因此用户可以实际看到它们。
第二个问题: viewDidAppear/viewWillAppear 在应用从后台返回时不会被调用,因此您不必担心它们会同时被调用。
在某些情况下,拥有一个整体的“viewHasDefinitelyAppeared”会很好,但在很多情况下您希望它们分开,并非所有应用都希望用户在从后台返回时看到动画,这是不可能的如果所有方法合二为一。
【讨论】:
没问题乔,(1)在您的代码示例中,我会说您拥有最明智的方式。如果您要在每次用户离开视图时显示动画,那么我建议将其放入 Will 消失。作为最后发生的事情,您取消注册通知是有意义的。 (2) 我相信你不必担心他们中的任何一个没有被调用。如果他们没有被调用,那么这就是 Apple 的问题。无论是否显示屏幕,都应该调用所有 4 个。我听到你在说最好的一对,但这真的取决于你需要做什么。 (i) 不抱歉,我没有 Apple 文档,它遇到了几次该问题,想知道为什么当我切换回我的应用程序时我的 viewDidAppear 不起作用。 (ii) 我认为你在这里仍然是安全的,因为 viewWillAppear 不会被足够早地调用来注册第一次启动的通知。我只是在设置一个测试来确认这一点,但我认为你不必担心双重调用。 我的立场是正确的, viewWillAppear 被调用得足够早,并且确实会导致通知在开始时被调用。我将相应地编辑我的答案。 ** UIApplicationWillEnterForegroundNotification** 是一个特别好的提示 - 谢谢!以上是关于viewDidAppear,而且当应用程序从后台返回时的主要内容,如果未能解决你的问题,请参考以下文章