阻止iOS SDK中的视图卸载?

时间:2011-01-26 06:33:32

标签: iphone objective-c ios uitableview mpmovieplayercontroller

我在UITabBarController中构建了一个在UINavigationController中使用UITableView的应用程序。 UITableView中的每个条目都会打开一个包含一些基本文本,按钮的视图,但最重要的是,MPMoviePlayerController在启动时播放音频。用户可以单击此MPMoviePlayerController并继续浏览应用程序的其余部分(不同的选项卡,或在navcontroller中向后移动,从tableview打开其他视图)并继续听到音频。

我希望用户能够随时使用活动的MPMoviePlayerController返回视图。我理解如何允许用户从任何视图返回到某个视图,但我正在努力避免在用户尝试访问同一视图时重新加载该视图。

有什么方法可以在内存中保存视图吗?或者将活动的MPMoviePlayerController保存为某种类型的全局对象,这样我至少可以从任何地方访问它?

我感谢任何帮助。谢谢!

4 个答案:

答案 0 :(得分:2)

我建议您在应用程序的UIApplicationDelegate中为MPMoviePlayerController创建一个属性(然后您可以使用[UIApplication sharedApplication] .delegate从代码中的任何位置访问该属性,但是您需要转换到您的UIApplicationDelegate子类)。

当您进入播放内容的屏幕时,请检查应用委托中的影片播放器属性是否为零,如果是创建,则重新使用。

当媒体停止播放,或媒体已停止并且您收到内存警告或应用程序关闭时,请不要忘记释放对MPMoviePlayerController的引用。

这种方法的缺点是它导致大多数视图控制器和您的应用程序委托之间的耦合。但是,您可以使用协议来缓解这种情况。

答案 1 :(得分:0)

你应该保留它。像这个[myView retain]一样,并在你需要的地方保留一个指针。当您希望myView显示时,只需将其作为子视图添加到当前可见视图,例如[myController.view addSubview:myView]

希望这会有所帮助,祝你好运!

答案 2 :(得分:0)

我发现即使添加一个保留也不行。我实际上通过覆盖setView找到了最好的成功(因为卸载视图的一部分涉及调用setView:nil。我有一个BOOL,第一次设置VC加载,一旦设置它将永远不会允许调用setView试。

- (void) setView: (UIView*) view{
  NSLog(@"MainViewController: setView");

  // this is our attempt to stop iOS from unloading our view.. when iOS tries to unload your view they call setView:nil.. so, no!
  if(!viewDidAppear) [super setView:view];
}    

答案 3 :(得分:0)

有点破解,但您可以覆盖子类中的setView:,以便永远不允许将视图设置为nil

-(void)setView:(UIView *)view
{
    if (view == nil) return;

    [super setView:view];
}