“隐藏” ViewController 而不完全关闭它
Posted
技术标签:
【中文标题】“隐藏” ViewController 而不完全关闭它【英文标题】:"Hide" ViewController without fully dismissing it 【发布时间】:2018-03-13 23:38:55 【问题描述】:我正在为 ios 构建一个播放视频的媒体播放器应用。有一个 TableViewController 允许您选择要播放的视频,然后选择一个打开该视频,在另一个 View Controller 中显示该视频,并在其下方显示自定义媒体控件。我可以关闭视频,并且由于某种原因,视频一直在后台播放,但我不确定如何在不创建新实例的情况下将其恢复。我会发布代码,但我什至不确定从哪里开始。
提前致谢。
【问题讨论】:
【参考方案1】:本质上,您希望创建一个视图控制器并将其存储在某个地方,直到您的应用程序执行(或您不再需要它)才会被释放。这可以是您的应用程序委托、单例或任何最适合您的方式。这样,视图控制器的单个实例就是您每次想要使用它时所获得的。
这是我的实现方式:
我会在应用程序委托上创建一个属性来存储我的视图控制器,以用于整个应用程序的执行。像这样,在您的应用委托标头中:
@property (nonatomic, retain) UIViewController *nowPlayingViewController;
(您可能希望将其设为您的实际子类,而不是 UIViewController,因为您可能需要将自定义数据等传递给此视图控制器实例)
-
在您的应用委托中为该视图控制器创建一个自定义 getter,以便在您第一次尝试访问您的视图控制器时自动创建它。在你的
- (UIViewController *)nowPlayingViewController 如果(_nowPlayingViewController == nil) // 初始化视图控制器(对于情节提要,你会这样做,确保情节提要文件名和视图控制器标识符设置正确): _nowPlayingViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"NowPlaying"]; 返回_nowPlayingViewController;
提醒:如果您正在播放的视图控制器嵌入在导航控制器中,您将需要实例化它。请记住,如果您将导航控制器存储在此变量中,则需要从它本身获取正在播放的视图控制器(例如,如果您打算在其上调用方法或设置属性)。如果这是真的,也许存储导航控制器并有一个方便的方法来返回正在播放的视图控制器 (
topViewController
) 本身。
-
现在,当您想要显示视图控制器时,以编程方式进行。如果你想以模态方式呈现它,你可以这样做:
MyAppDelegate *delegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate; [self presentViewController:delegate.nowPlayingViewController 动画:YES 完成:nil];
要关闭,只需像平常一样在视图控制器上调用dismissViewControllerAnimated:
(或者如果在导航控制器中弹出它,实际上你会这样做)。因为它存储在您的应用程序委托中,并在您的应用程序会话中持续存在,所以它将始终是同一个实例。
作为奖励,如果您确实想销毁视图控制器,可以将代理上的属性设置为 nil
,下次使用时它会自动创建。
您的实现可能会有所不同,并根据需要进行调整以适应您的应用需求,但这是一个起点。
【讨论】:
谢谢,我在 swift 4.2 上运行良好,我使用 Objectivec2swift 转换了代码 是否可以调整视图控制器的大小以使其在关闭时保持在顶部?以上是关于“隐藏” ViewController 而不完全关闭它的主要内容,如果未能解决你的问题,请参考以下文章
为啥“ARFaceTrackingConfiguration.isSupported”语句在 AppDelegate 中,而不是在 ViewController 中?
如何在多个 ViewController 中使用 NSFetchedResultsControllerDelegate 而不重复控制器代码?
swift 以编程方式转到下一个viewController而不使用storyboard