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

时间:2014-01-15 16:00:34

标签: ios iphone objective-c cocoa-touch childviewcontroller

所有

ChildViewControllers中使用多个ParentViewController时,我遇到了一些性能/内存问题。以下是我的情况:我的ParentViewController动态编号为ChildViewControllers - 有时多达20个。它们包含在UIScrollView中,并且会被分页。当我在页面上有几个时,我遇到了问题(我只是加载前两个,然后在刷卡时构建其他的)但是,在ParentViewController内有多个崩溃开始导致一些崩溃由于记忆。

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

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

我的另一个想法是建立一个自定义ContainerViewController并让所有的孩子都在那里轻扫,但我不确定这是否会比使用{{1 }}

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

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

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

UIViewController *newChildViewController = ...
[self addChildViewController:newChildViewController];
newChildViewController.view.frame = ...; 
[self.scrollView addSubview:newChildViewController.view];
[newChildViewController didMoveToParentViewController:self];

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

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

[childViewControllerToRemove willMoveToParentViewController:nil];
[childViewControllerToRemove.view removeFromSuperview];
[childViewControllerToRemove removeFromParentViewController];
// also remove any other strong references you have to that childViewControllerToRemove

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

答案 1 :(得分:0)

我认为将它们全部移至UIView会有所帮助。你可以通过添加aChildViewController.view来实现同样的效果,而无需在技术上将其添加为childView。我会优化视图加载到UIScrollView。确保你只有4个视图一次加载到内存中。另一种选择是使用水平UITableViewUICollectionView,这样您就可以获得他们内置的内存管理功能。

答案 2 :(得分:0)

您可以将其转换为tableview,让单元格出列接管。那时你只会有一些内存。