我制作了一款播放器应用。当用户关闭应用程序(进入后台模式)并调用viewWillDisappear时,播放器会停止播放音频。
我无法在applicationDidEnterBackground中停止,因为在此方法中我已播放音频,以便在后台访问音频。
但问题发生在应用程序内部我想要更改视图并调用viewWillDisappear,显然音频停止。
只有在用户关闭应用程序时才调用viewWillDisappear,或者在用户更改选定的tabbar或打开其他viewcontroller时调用viewWillDisappear。
由于
答案 0 :(得分:3)
viewWillDisappear
是一个回调方法,是视图生命周期的一部分,你无法控制它何时被调用。
您可以参考apple docs (link):
调用此方法以响应从视图中删除的视图 层次结构。在实际删除视图之前调用此方法 在配置任何动画之前。
子类可以覆盖此方法并使用它来提交编辑 更改,重新签名视图的第一响应者状态或执行 其他相关任务。例如,您可以使用此方法还原 更改状态栏的方向或样式 在viewDidDisappear:首次显示视图时的方法。如果 你重写这个方法,你必须在你的某个时刻调用super 实施
答案 1 :(得分:3)
与@Bhumit一样,您无法控制视图生命周期(或应用程序生命周期)的callback methods。当用户与您的应用程序交互时,他们会在特定时间调用它们。 / p>
让我们考虑一下您可能想要做的事情:
- (void)viewWillDisappear
{
[super viewWillDisappear];
[[AudioPlayerClass sharedInstance] stop]; // an example way to stop playing the audio
}
每当用户解除模态视图,导航到导航控制器上的新视图或点击选项卡栏控制器中的选项卡时,都会调用 viewWillDisappear
。如果您的用户打开设置标签,音频将停止。如果他们打开另一个标签,它就会停止。您已经描述过这个问题了。
我们希望应用在视图消失并满足其他条件时停止播放音频。我们在代码中查看它:
- (void)viewWillDisappear
{
[super viewWillDisappear];
if (something)
{
[[AudioPlayerClass sharedInstance] stop]; // an example way to stop playing the audio
}
}
根据您的问题,这个条件是应用程序关闭时。
如果视图消失且应用关闭,只有一些方法可以更改音频,该怎么办?
事实是我们可以简化这一点,因为如果应用程序正在关闭,那么视图也会消失。所以我们真正想要的是:
if(/* app is closing */)
{
/* Stop the music. */
}
好吧,为此我们在app delegate中定义了app生命周期方法。您可能想要使用的是applicationWillResignActive:
,它会在应用关闭之前调用,但它仍处于打开状态。
- (void)applicationWillResignActive:(UIApplication *)application
{
[[AudioPlayerClass sharedInstance] stop]; // an example way to stop playing the audio
}
让我感到困惑的是,您说使用applicationDidEnterBackground
可以在后台访问音频,但是您想在进入后台时停止播放。
这让我感到困惑,因为我不确定你是想要停止音频还是启用音频。此外,您可能不应该在应用程序停用之前运行的委托方法中配置回放会话。
您最好在application:didFinishLaunchingWithOptions:
或更好applicationDidBecomeActive:
配置会话一次。这样,您的应用就会在需要时拥有所需的正确会话,然后您就可以在应用生命周期中随意进入您想要的状态。