一个XIB内的多个视图 - iPhone SDK

时间:2009-04-19 14:51:07

标签: iphone xib

我一直在花时间学习如何使用iPhone SDK。我从头到尾阅读了“Beginning iPhone Development: Exploring the iPhone SDK”,我从未在一个XIB中看到多个视图的示例。

为了说明我的意思,这里是一个XIB的屏幕截图,其中包含我所指的简单配置:

alt text http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

我认为必须有一个非常具体的原因,我从未见过这个。在Apple的示例和我迄今为止的所有读数中,多个XIB仅使用一个“视图”(有时是导航控制器或标签栏控制器等)。这是什么原因?我应该避免XIB内的多个视图吗?这两种方法有哪些优点或缺点?

提前谢谢

3 个答案:

答案 0 :(得分:21)

这是内存优化和加载时间的问题。如果将所有视图放在一个XIB中,那么当应用程序启动时,它必须将整个XIB加载到内存中并构造所有控件的所有对象,这需要花费很多时间。

如果您将视图分离为单独的XIB,那么您的应用程序将启动得更快,因为只会加载包含初始视图的XIB,并且它最初也会使用更少的内存。然后,当视图更改时,您可以懒惰地加载包含新视图的XIB。这在第一次打开视图时会产生轻微的故障。如果您确实尝试优化内存使用,您也可以在切换视图时卸载上一个视图,但我不建议这样做,因为这会在每次切换视图时出现问题,而是只是你第一次切换到任何给定的视图。

答案 1 :(得分:4)

按照上一个答案,有时您希望同时加载多个视图。下面是一个示例:您正在显示包含多个页面的报表,并且您将使用UIScrollView来管理它们。当用户完成浏览报告后,他将关闭将取消该视图的报告。

在XIB中创建UIScrollView以及您需要的每个页面的UIView。由于UIViews是XIB的一部分,因此当报表打开时,它们将一起加载到内存中。创建两个UIViewControllers并使用它们来显示正在查看的页面和正在滚动的页面。当用户浏览页面时,重新使用滚动页面上的UIViewController来保持正在滚动的页面。

这将确保在用户翻阅页面时获得出色的性能。它将所有页面一次性加载到内存中。我只使用了两个UIViewControllers,它只是更改了它们中的视图并移动它们。

这也有将所有页面放在一个XIB中的巨大好处。与单独的XIB相比,它更容易编辑,加载更快。您只需要确保有内存一次加载所有页面。如果它是静态内容(例如在我的情况下),这是一个很好的方式。

如果你正在寻找一个如何做到这一点的好例子,我发现这个资源是一个很好的起点:

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

答案 2 :(得分:2)

这是对任何试图在单个XIB(带有Xcode 4的iOS 4)中使用两个视图实现横向和纵向的人的警告。在单个XIB中为我提供两个视图的主要缺点是,您只能将XIB中的单个UIOutlet对象连接到视图控制器中的单个UIOutlet对象。

因此,例如,如果您有一个带有横向视图和纵向视图的XIB,并且两个视图在不同位置包含相同的界面对象(例如横向中的UILabel和纵向中的UILabel)。无法将纵向视图中的UILabel 和横向视图中的UILabel对象链接到视图控制器中的单个UILabel对象

我发现这令人失望,因为iOS UIViewController文档(iOS 4.3)建议我可以通过在屏幕旋转时以编程方式在两个视图之间切换来实现自定义横向和纵向视图。

花了很长时间才弄清楚如何做到这一点,我发现可以将两个不同的视图连接到一个视图控制器,但是你需要为两个视图都有插座。例如,在我的视图控制器中,我有两个UILabel对象(一个用于连接到纵向视图中的UILabel;一个用于连接到横向视图中的UILabel)。在我的代码中,每次更新横向插座时,我都会更新纵向横向。

不是很优雅,但它可以工作,并且由于这是一个简单的视图,只有一个屏幕,它不会占用太多内存,所有UI对象都在控制器和视图中重复。我不会创建一个再次这样做的项目,但是对于该项目来说这是一个很好的解决方案。

相关问题