【问题标题】:Multiple Views within one XIB - iPhone SDK一个 XIB 中的多个视图 - iPhone SDK
【发布时间】:2010-10-20 09:56:05
【问题描述】:

我一直在花时间学习如何使用 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 中使用多个视图吗?这两种方法的优点或缺点是什么?

提前谢谢你

【问题讨论】:

    标签: iphone xib


    【解决方案1】:

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

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

    【讨论】:

    • 我对这里的“视图”和 XIB 之间的区别有点不清楚。对于(一个真实的)示例,假设我必须实现一些顶部的地图视图,底部的 3 个按钮,以及中间的不同控件,具体取决于条件。中间可以是 a.) 以特定方式格式化的标签,或 b.) 以不同方式格式化的图像和较少的标签。我的想法是 3 个视图——一个视图来处理每组控件(地图、条件控件、按钮)。在一个 XIB 中执行 3 个视图还是将所有控件放在一个视图中更好?
    • 当然,您不应该将每个视图都放在一个 XIB 中,但他问您是否有理由根本不应该这样做。肯定有它有用的时候。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-17
          • 2014-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          相关资源
          最近更新 更多