iPhone 应用程序:整体应用程序层次结构和架构

Posted

技术标签:

【中文标题】iPhone 应用程序:整体应用程序层次结构和架构【英文标题】:iPhone Application: Overall Application Hierarchy & Architecture 【发布时间】:2009-05-05 06:09:34 【问题描述】:

我在使用我的第一个真正的 iPhone 应用程序时遇到了一些困难,想就如何构建它获得一些建议。我正在寻找一些关于创建 UI 组件并将它们链接在一起以创建应用程序流的最佳实践(以编程方式创建视图/控制器与使用 Interface Builder 等...)。

概述: 我需要在应用程序启动时显示“登录”视图。 --如果他们单击注册按钮,则显示“注册”视图。

登录后...我有一个 TabBarController 加载 4 个视图。这 4 个视图将必须加载子视图(主详细信息)。

我的问题是: 1) 将这种导航结构拼凑在一起的最佳方式是什么?将每个视图创建为具有相应 ViewController 的 .xib?这些是怎么粘在一起的?

2) 我应该如何处理登录/注册导航,开始时不应显示 TabBar,但在验证用户后将需要它。

奖励积分)是否有记录在案的此类内容的最佳实践?我一直在编写一些可行的代码,但我迷失了方向,想以正确的方式重新开始。

我知道这可能有点令人困惑,非常感谢所有和任何帮助。

编辑:对于标签栏顶部的登录视图,我使用了这个,非常简单。

LoginViewController *loginViewController = [[LoginViewController alloc] init]; [loginViewController initWithNibName:@"Login" bundle:nil]; [self.tabBarController presentModalViewController:loginViewController 动画:YES];

【问题讨论】:

【参考方案1】:

当您在 XCode 中创建一个基于标签栏的新应用程序时,您几乎已经按照您想要的方式进行了设置 - 有一个主 XIB 可以从单独的 XIB 文件中为每个标签加载视图。每个选项卡有一个 XIB。请注意,当您更改类型或添加选项卡时,您需要在带有选项卡栏的 XIB 以及用于创建视图的 XIB 中指定正确的视图控制器类型!

对于登录视图,一种常见的方法是使用上面的标签栏,但在应用程序委托 applicationDidFinishLaunching 方法中呈现一个显示登录屏幕的模态视图控制器。模态控制器隐藏标签栏和其他所有内容,直到它们完成,然后可以将其关闭。

【讨论】:

你能详细说明一下 presentModalViewController 调用吗?看起来我必须在导航控制器上调用它,我只有一个 tabbarcontroller。 presentModalViewController 是 UIViewController 上的一种方法,而不仅仅是导航控制器 - 您可以使用标签栏控制器或任何其他视图控制器。【参考方案2】:

1) 将这个导航结构拼凑在一起的最佳方式是什么?将每个视图创建为具有相应 ViewController 的 .xib?这些是怎么粘在一起的?

使用UINavigationController 并根据需要将您的自定义视图推送到导航堆栈。通过 Xcode 的 New Project 选项查看示例 Navigation Controller 应用程序,以了解其工作原理。

2) 我应该如何处理登录/注册导航,开始时不应显示 TabBar,但在验证用户身份后将需要它。

设置登录视图(我会使用UITableView,其中一个部分包含两行用户名和密码,但这是我自己的偏好)。为注册字段设置第二个单独的视图(同样,我会为此使用 UITableView,以保持布局整洁和一致)。

或许在认证成功后使用视图动画弹出标签栏。

奖励积分)是否有记录在案的此类内容的最佳实践?我一直在编写一些可行的代码,但我迷失了方向,想以正确的方式重新开始。

您最终会多次重写您的项目 — 这是一件好事。请查看 Apple 的示例应用程序(可从 iPhone ADC 站点获得),因为这些应用程序包含使用多个 UIKit 组件的几种“最佳实践”方式。至于组装一个更大的应用程序,请让您的设计尽可能简单,并尽可能多地重用 Apple 的 UI 组件。您可以随时自定义。

【讨论】:

【参考方案3】:

在我看来,只有 Cocoa 编程示例和非常简单的应用程序才适合单个 nib 文件。否则,您应该将界面组件分布在多个 nib 上。这意味着每个 nib 都更小,当加载到内存中时,只会在必要时加载那些组件。这将提高您的应用程序的性能,并有助于在逻辑上组织您的程序并在出现问题时更容易调试。

在我的标签栏应用程序中,我使用 MainWindow.xib 来包含主窗口和标签栏,但出于上述原因,我将每个标签拆分为一个单独的 nib。

Apple 提供以下指南:

在创建 nib 文件时,请尽量牢记以下准则:

在设计您的 nib 文件时考虑到延迟加载。计划立即加载仅包含您需要的对象的 nib 文件。

在 Mac OS X 应用程序的主 nib 文件中,请考虑在 nib 文件中仅存储应用程序菜单栏和可选的应用程序委托对象。避免包含在应用程序启动之前不会使用的任何窗口或用户界面元素。相反,将这些资源放在单独的 nib 文件中,并在启动后根据需要加载它们。

将重复的用户界面组件(例如文档窗口)存储在单独的 nib 文件中。

对于仅偶尔使用的窗口或菜单,将其存储在单独的 nib 文件中。通过将其存储在单独的 nib 文件中,只有在实际使用时才将资源加载到内存中。

更多信息您可以访问:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4

【讨论】:

以上是关于iPhone 应用程序:整体应用程序层次结构和架构的主要内容,如果未能解决你的问题,请参考以下文章

类似 Twitter 设计结构的 iPhone 应用

在 Core Data iPhone 应用程序的视图层次结构中保存位置

软件架构软件框架设计模式

设计模式11-- 搞定组合模式

iPhone:视图和子视图的层次结构

组合模式