需要有关多个子视图控制器的建议

cod*_*der 3 iphone cocoa-touch objective-c ios childviewcontroller

所有,

我使用的几个运行时将一些性能/内存问题ChildViewControllers在我ParentViewController.这是我的情况:我有一个ParentViewController动态数字ChildViewControllers- 有时多达20个.它们包含在a中UIScrollView,并被分页.当我在页面上有几个时,我遇到了问题(我只是加载了前两个,然后在刷卡的同时构建其他的),然而,ParentViewController由于内存的原因,开始导致一些崩溃.

其中ChildViewController有很多内容,我正在通过它来确保它尽可能高效,但是,我担心这种方法适用于旧设备(因为我在5S上遇到崩溃) .

似乎将视图控制器更改为仅视图会有所帮助,但由于VC很复杂,因此这是一项非常大的工作.我的一个建议是从现有视图控制器的视图创建一个视图,并在视图上设置多个委托方法,并以ParentViewController这种方式与视图交互.对于当前的使用方法,是否有人对该方法的效率有任何想法ChildViewControllers

我的另一个想法是建立一个习俗,ContainerViewController并让所有的孩子都在那里轻扫,但我不确定这是否会让我比使用孩子更有优势UIScrollView.

有什么想法吗?

Rob*_*Rob 5

我个人不会主张重构您的代码以使用视图而不是查看控制器.视图控制器本身不太可能是内存问题的根源,而是它们跟踪的模型对象(以及视图控制器视图使用的资源).我认为关键是当它们滚出屏幕时简单地删除视图控制器(和它们的视图).

在滚动逻辑中,当您添加滚动到视图的子视图控制器时,您可能正在执行所有适当的包含调用:

UIViewController *newChildViewController = ...
[self addChildViewController:newChildViewController];
newChildViewController.view.frame = ...; 
[self.scrollView addSubview:newChildViewController.view];
[newChildViewController didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)

(请参阅WWDC 2011视频实现UIViewController Containment,以了解执行这些包含调用的重要性,即保持视图控制器层次结构与视图层次结构同步.)

当子视图滚动出视图时,您只需执行适当的包含调用以删除子控制器(及其视图):

[childViewControllerToRemove willMoveToParentViewController:nil];
[childViewControllerToRemove.view removeFromSuperview];
[childViewControllerToRemove removeFromParentViewController];
// also remove any other strong references you have to that childViewControllerToRemove
Run Code Online (Sandbox Code Playgroud)

或者,您可能想要考虑使用UIPageViewController哪个(在iOS 6+中)提供滚动页面视图(UIPageViewControllerTransitionStyleScroll)transitionStyle.这简化了您必须编写的自定义容器代码的数量,以处理滚动进出视图的视图控制器.它UIPageViewController被精确地设计用于通过一堆不同的视图控制器视图滚动(或分页)的情况.请参阅适用于iOSView Controller Catalog中页面视图控制器讨论.