防止在 iOS SDK 中卸载视图?
Posted
技术标签:
【中文标题】防止在 iOS SDK 中卸载视图?【英文标题】:Preventing view from unloading in iOS SDK? 【发布时间】:2011-01-26 06:33:31 【问题描述】:我已经构建了一个在 UINavigationController 内使用 UITableView 的应用程序,在 UITabBarController 内。 UITableView 中的每个条目都会打开一个包含一些基本文本、按钮的视图,但最重要的是,一个 MPMoviePlayerController 会在启动时播放音频。用户可以单击此 MPMoviePlayerController 并继续浏览应用程序的其余部分(不同的选项卡,或返回导航控制器,从 tableview 打开其他视图)并继续收听音频。
我希望用户能够随时返回到具有活动 MPMoviePlayerController 的视图。我了解我将如何允许用户从任何视图返回到某个视图,但我正在努力防止在用户尝试访问同一视图时重新加载该视图。
有什么方法可以将视图保存在内存中?或者将活动的 MPMoviePlayerController 保存为某种类型的全局对象,这样我至少可以从任何地方访问它?
我感谢任何和所有的帮助。谢谢!
【问题讨论】:
【参考方案1】:我建议您在应用的 UIApplicationDelegate 中为 MPMoviePlayerController 创建一个属性(然后您可以使用 [UIApplication sharedApplication].delegate 从代码中的任何位置访问该属性,但您需要将其转换为您的 UIApplicationDelegate 子类)。
当你进入播放内容的屏幕时,检查你在app delegate中的movie player属性是否为nil,如果是create,则重新使用。
不要忘记在媒体停止播放时释放对 MPMoviePlayerController 的引用,或者当媒体已经停止并且您收到内存警告或应用关闭时。
这种方法的缺点是它会导致大多数视图控制器和应用程序委托之间存在耦合。但是,您可以通过使用协议来缓解这种情况。
【讨论】:
【参考方案2】:您应该简单地保留它。像这样[myView retain]
并在您需要的地方保留指向它的指针。当您希望 myView 出现时,只需将其作为子视图添加到当前可见视图中,例如[myController.view addSubview:myView]
。
希望对你有所帮助,祝你好运!
【讨论】:
【参考方案3】:我发现即使添加保留也不起作用。实际上,我发现重写 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];
【讨论】:
【参考方案4】:有点小技巧,但你可以在你的子类中覆盖setView:
,这样它就永远不允许将视图设置为nil
:
-(void)setView:(UIView *)view
if (view == nil) return;
[super setView:view];
【讨论】:
以上是关于防止在 iOS SDK 中卸载视图?的主要内容,如果未能解决你的问题,请参考以下文章
在视图初始化之前调用视图控制器中的方法 - iPhone iOS 5 SDK
防止 UISearchController 在 IOS8 中隐藏视图导航栏
如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?