用户进入后台模式时使用viewWillDisappear

时间:2015-04-09 11:12:07

标签: ios xcode background

我制作了一款播放器应用。当用户关闭应用程序(进入后台模式)并调用viewWillDisappear时,播放器会停止播放音频。

我无法在applicationDidEnterBackground中停止,因为在此方法中我已播放音频,以便在后台访问音频。

但问题发生在应用程序内部我想要更改视图并调用viewWillDisappear,显然音频停止。

只有在用户关闭应用程序时才调用viewWillDisappear,或者在用户更改选定的tabbar或打开其他viewcontroller时调用viewWillDisappear。

由于

2 个答案:

答案 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:配置会话一次。这样,您的应用就会在需要时拥有所需的正确会话,然后您就可以在应用生命周期中随意进入您想要的状态。