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 应用程序:整体应用程序层次结构和架构的主要内容,如果未能解决你的问题,请参考以下文章