我有一个单一视图应用程序。当我点击主页按钮并“最小化”应用程序时,我希望能够在用户重新打开它时执行代码。
由于某种原因,当我最小化并重新打开应用程序时,viewDidAppear 和 viewWillAppear 不会执行。
有什么建议么?
在此先感谢萨亚当
我有一个单一视图应用程序。当我点击主页按钮并“最小化”应用程序时,我希望能够在用户重新打开它时执行代码。
由于某种原因,当我最小化并重新打开应用程序时,viewDidAppear 和 viewWillAppear 不会执行。
有什么建议么?
在此先感谢萨亚当
您可以在应用程序委托中执行代码
- (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:
让响应通知的方法调用此新方法。
这是因为自从 Apple 实施了“多任务处理”后,当您再次启动应用程序时,它们会完全重新加载,就像您从未关闭它们一样。因此,没有理由调用 viewDidAppear。
您可以实施
- (void)applicationWillEnterForeground:(UIApplication *)application
并在那里做任何你想做的事。或者您在视图控制器中注册通知UIApplicationWillEnterForegroundNotification
。在 viewDidLoad 中执行此操作:
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myAppWillEnterForeground)
name:UIApplicationWillEnterForegroundNotification object:nil];
当然,实现指定的选择器并在那里做你想做的事。
我不确定@Paul.s 的答案如何执行 OP 请求,因为注册UIApplicationDidBecomeActiveNotification
将执行两次:
更好的做法是将这些事件解耦为 2 个不同的通知:
当应用程序激活时发布。应用程序在接收事件时处于活动状态。一个活跃的应用程序可以说是有焦点的。它在启动后获得焦点,在弹出覆盖窗口或设备锁定时失去焦点,并在设备解锁时获得焦点。
这基本上意味着所有与“应用程序首次启动时”相关的逻辑
在应用程序离开后台状态成为活动应用程序之前不久发布。
通过这种方式,我们可以创建一个可以执行两种算法但作为解耦方式的设计:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethodName1) name:UIApplicationWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethodName2) name:UIApplicationDidBecomeActiveNotification object:nil];
这是因为您不会重绘视图。在 AppDelegate 中使用applicationWillEnterForeground代替。这应该适合你。