4

我有一个单一视图应用程序。当我点击主页按钮并“最小化”应用程序时,我希望能够在用户重新打开它时执行代码。

由于某种原因,当我最小化并重新打开应用程序时,viewDidAppear 和 viewWillAppear 不会执行。

有什么建议么?

在此先感谢萨亚当

4

4 回答 4

13

您可以在应用程序委托中执行代码

- (void)applicationDidBecomeActive:(UIApplication *)application

或注册以观察UIApplicationDidBecomeActiveNotification通知并执行您的代码作为响应。

应用委托中还有通知UIApplicationWillEnterForegroundNotification和方法- (void)applicationWillEnterForeground:(UIApplication *)application


要连接通知,请在适当的位置添加

  [[NSNotificationCenter defaultCenter] addObserver:self 
                                       selector:@selector(didBecomeActive:)
                                           name:UIApplicationDidBecomeActiveNotification
                                         object:nil];

定义一个对应的方法

- (void)didBecomeActive:(NSNotification *)notification;
{
    // Do some stuff
}

然后不要忘记在适当的时候让自己成为观察者

[[NSNotificationCenter defaultCenter] removeObserver:self];

讨论

您很可能只希望您的 viewController 在它是当前活动的视图控制器时响应事件,因此注册通知的好地方是viewDidLoad,然后是作为观察者移除自己的好地方viewDidUnload

如果您想运行在您的viewDidAppear:方法中出现的相同逻辑,则将其抽象为另一个方法并viewDidAppear:让响应通知的方法调用此新方法。

于 2012-05-13T15:57:50.880 回答
2

这是因为自从 Apple 实施了“多任务处理”后,当您再次启动应用程序时,它们会完全重新加载,就像您从未关闭它们一样。因此,没有理由调用 viewDidAppear。

您可以实施

- (void)applicationWillEnterForeground:(UIApplication *)application

并在那里做任何你想做的事。或者您在视图控制器中注册通知UIApplicationWillEnterForegroundNotification。在 viewDidLoad 中执行此操作:

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myAppWillEnterForeground) 
    name:UIApplicationWillEnterForegroundNotification object:nil];

当然,实现指定的选择器并在那里做你想做的事。

于 2012-05-13T16:04:02.130 回答
1

我不确定@Paul.s 的答案如何执行 OP 请求,因为注册UIApplicationDidBecomeActiveNotification将执行两次:

  1. 启动应用程序时
  2. 当应用程序进入后台时

更好的做法是将这些事件解耦为 2 个不同的通知

  1. UIApplicationDidBecomeActiveNotification

当应用程序激活时发布。应用程序在接收事件时处于活动状态。一个活跃的应用程序可以说是有焦点的。它在启动后获得焦点,在弹出覆盖窗口或设备锁定时失去焦点,并在设备解锁时获得焦点。

这基本上意味着所有与“应用程序首次启动时”相关的逻辑

  1. UIApplicationWillEnterForegroundNotification

在应用程序离开后台状态成为活动应用程序之前不久发布。

结论

通过这种方式,我们可以创建一个可以执行两种算法但作为解耦方式的设计:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethodName1) name:UIApplicationWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethodName2) name:UIApplicationDidBecomeActiveNotification object:nil];
于 2015-10-29T14:11:23.850 回答
0

这是因为您不会重绘视图。在 AppDelegate 中使用applicationWillEnterForeground代替。这应该适合你。

于 2012-05-13T15:57:47.557 回答