在UIPageControl上加载ViewControllers的替代方法

时间:2013-04-01 08:33:00

标签: iphone ios objective-c uipagecontrol

在我的项目中,我使用UIPageControl作为容器UIViewController进行滚动。我使用了本教程(使用ARC和故事板):http://www.wannabegeek.com/?p=168和源代码:https://github.com/wannabegeek/PageViewController 正如您所看到的,项目中有3个ViewControllers,它们作为子项添加到CustomPagerViewController。在该项目中,只添加了3个ViewControllers,但在我的项目中,我获得了3 ViewControllers以上,我还将其与其他文本,图像,标签等一起重复使用。问题是,在项目中,只要加载ViewControllers,所有CustomPagerViewController都会被加载,这会花费内存,所以我正在寻找另一种方法来解决这个问题而不是加载它们立刻?

1 个答案:

答案 0 :(得分:0)

您不应该尝试以这种方式优化控制器分配。显然在内存中保留视图控制器会占用空间,但请相信我,而不是那么多。

我们必须区分控制器和它的视图。视图可以占用大量内存以使自己显示在屏幕上,但iOS已经有了自己的机制来释放不再需要的内存(即:视图不在屏幕上/没有窗口)

用于自行释放视图内存的iOS视图控制器(此行为在[UIViewControllers didReceiveMemoryWarning]中),但在iOS 6中已不再是这种情况。现在您有责任这样做,因为您觉得它是您需要的应用程序。请记住,尽管在这种方法(或dealloc)中使用这些视图,但是你不会节省太多内存,因为用于在屏幕中显示视图的大部分(图形)资源可能已经被iOS发布,并且你可能最终释放的记忆量接近0。

总而言之,在您的情况下,我将使用this guide将PagerViewController转换为适当的iOS容器控制器。关键是调用以下方法:

[UIViewController addChildViewController:]
[UIViewController willMoveToParentViewController]
[UIViewController removeFromParentViewController]
[UIView addSubview:]
[UIView removeFromSuperview]

根据您的需要以正确的顺序。在您的情况下,您可以在scrollViewDidScroll方法中添加/删除这些。以这种方式使用它们,让苹果的魔力发生。

您也可以使用UIPageViewController,它可以为您提供一些不错的开箱即用功能。