17

我一直在花时间学习如何使用 iPhone SDK。我从头到尾阅读了“开始 iPhone 开发:探索 iPhone SDK ”,但我从未见过一个 XIB 中多个视图的示例。

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

替代文字 http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

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

先感谢您

4

4 回答 4

21

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

相反,如果您将视图分成单独的 XIB,那么您的应用程序将启动得更快,因为只有包含初始视图的 XIB 会被加载,而且一开始它也会使用更少的内存。然后,当视图更改时,您可以延迟加载包含新视图的 XIB。第一次打开视图时,这将导致一个小问题。如果你真的想优化内存使用,你也可以在切换视图时卸载前一个视图,但我不建议这样做,因为每次切换视图时都会出现问题,而不仅仅是第一次切换到任何给定的视图。

于 2009-04-19T15:08:05.330 回答
4

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

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

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

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

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

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

于 2009-10-31T16:34:28.353 回答
2

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

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

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

在花了相当长的时间弄清楚如何做到这一点之后,我发现可以将两个不同的视图附加到一个视图控制器上,但是你需要为这两个视图都有出口。例如,在我的视图控制器中,我有两个 UILabel 对象(一个连接到纵向视图中的 UILabel;一个连接到横向视图中的 UILabel)。在我的代码中,每次更新横向出口时,我也会更新纵向横向。

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

于 2011-09-25T18:43:50.417 回答
0

我在一个 xib 中放置多个视图的一个原因是因为与故事板 xib 不同的是,它不允许在表格视图本身中放置页眉和页脚。所以我为页眉和页脚视图创建了单独的视图,并将它们分配在viewDidLoad.

于 2021-08-16T08:21:29.837 回答