代码之家  ›  专栏  ›  技术社区  ›  JustMe

“隐藏”ViewController而不完全禁用它

  •  2
  • JustMe  · 技术社区  · 7 年前

    我正在为iOS构建一个播放视频的媒体播放器应用程序。有一个TableViewController,允许您选择要播放的视频,选择其中一个将打开该视频,在另一个视图控制器中显示该视频,其下方有自定义媒体控件。我可以关闭视频,出于某种原因,视频一直在后台播放,但我不知道如何在不创建新实例的情况下将其恢复。我会发布代码,但我甚至不知道从哪里开始。

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   AppleBetas    7 年前

    本质上,您希望创建一个视图控制器并将其存储在某个位置,直到您的应用程序释放(或者您不再需要它)后才能将其释放。这可以是您的应用程序委托、单例或任何最适合您的东西。这样,视图控制器的单个实例就是您每次想要使用它时所得到的。

    下面是我将如何实现它:

    1. 我会在应用程序委托上创建一个属性来存储我的视图控制器,以便在应用程序的整个执行过程中使用。同样,在应用程序代理标题中:

      @property (nonatomic, retain) UIViewController *nowPlayingViewController;

    (您可能希望将其作为实际的子类,而不是UIViewController,因为您可能需要将自定义数据等传递到此view controller实例)

    1. 在应用程序委派中为该视图控制器创建自定义getter,以便在您首次尝试访问视图控制器时自动创建它。在您的
    - (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. 现在,当您想要显示视图控制器时,请按编程方式进行。如果您想以模式呈现,可以这样做:
    MyAppDelegate *delegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
    [self presentViewController:delegate.nowPlayingViewController animated:YES completion:nil];
    1. 要解雇,只需打电话 dismissViewControllerAnimated: 像普通一样在视图控制器上(如果在导航控制器中,也可以弹出它,不管你怎么做)。因为它存储在应用程序的会话中持续存在的应用程序委托中,所以它将始终是同一个实例。

    2. 另外,如果确实要销毁视图控制器,可以将委托上的属性设置为 nil ,下次使用时,它将自动创建。

    您的实现可以有所不同,并根据需要进行调整以满足应用程序的需要,但这只是一个起点。