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