"隐藏" ViewController没有完全解雇它

时间:2018-03-13 23:38:56

标签: ios objective-c video uiviewcontroller

我正在构建一个播放视频的iOS媒体播放器应用。有一个TableViewController允许您选择要播放的视频,并选择一个视频打开该视频,在另一个View Controller中显示视频,其下方有自定义媒体控件。我能够关闭视频,并且出于某种原因,视频会在后台继续播放,但我不确定如何在不创建新视频的情况下重新播放视频。我会发布代码,但我甚至不知道从哪里开始。

提前致谢。

1 个答案:

答案 0 :(得分:1)

从本质上讲,您希望创建一个视图控制器并将其存储在某个地方,直到您的应用程序执行(或者您不再需要它)时才会解除分配。这可能是您的应用程序委托,单身人士或其他最适合您的人。这样,视图控制器的单个实例就是每次要使用它时获得的。

以下是我实施它的方法:

  1. 我会在app委托上创建一个属性来存储我的视图控制器,以便我的应用程序执行完整。像这样,在你的app delegate标题中:

    @property (nonatomic, retain) UIViewController *nowPlayingViewController;

  2. (您可能希望将其设为实际的子类,而不是UIViewController,因为您可能需要将自定义数据等传递给此视图控制器实例)

    1. 在应用委托中为该视图控制器创建自定义getter,以便在您第一次尝试访问视图控制器时自动创建该getter。在你的
    2. - (UIViewController *)nowPlayingViewController {
          if (_nowPlayingViewController == nil) {
              // initialize view controller (for a storyboard, you'd do it like so, making sure your storyboard filename and view controller identifier are set properly):
              _nowPlayingViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"NowPlaying"];
          }
          return _nowPlayingViewController;
      }
        

      提醒:如果您正在播放的视图控制器嵌入在导航控制器中,您将要实例化它。请记住,如果将导航控制器存储在此变量中,则需要从其自身获取正在播放的视图控制器(例如,如果您要调用方法或在其上设置属性)。如果这是真的,可以存储导航控制器并有一个方便的方法来返回正在播放的视图控制器(topViewController)本身。

      1. 现在,当您想要显示视图控制器时,请以编程方式执行。如果你想以模态方式呈现它,你可以这样做:
      2. MyAppDelegate *delegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
        [self presentViewController:delegate.nowPlayingViewController animated:YES completion:nil];
        1. 要解雇,只需像正常一样在视图控制器上调用dismissViewControllerAnimated:(如果在导航控制器中,则弹出它,但实际上你是这样做的)。因为它存储在您的应用程序委托中持久存储的应用程序代理中,所以它将始终是同一个实例。

        2. 作为奖励,如果您确实要销毁视图控制器,可以将代理的属性设置为nil,下次使用时它将自动创建。

        3. 您的实施可能会有所不同,并根据需要进行调整,但这是一个起点。