iPhone开发 - 应用程序设计模式

时间:2010-05-23 20:56:01

标签: iphone design-patterns

iPhone上有大量有关编码的资源。他们中的大多数关注“我如何做X”,例如“设置导航控制器”或“从URL下载文本”。一切都很好。

我现在更感兴趣的是更简单的问题 - 如何最好地构建复杂的用户界面或应用程序,或出现的常见问题。为了说明:像“开始iPhone 3开发”这样的书告诉你如何设置一个多视图控制器应用程序,其顶部的“切换器”视图控制器可以在其他视图控制器拥有的视图之间切换。很好,但你只被告知如何做到这一点,而不是可能出现的问题:例如,如果我使用他们的范例切换到UINavigationViewController,导航栏在屏幕上的结果太低,因为UINavigationViewController期望成为最顶级的UIViewController(显然)。此外,委托方法(例如,与方向改变有关)转到顶部切换器视图控制器,而不是负责当前视图的实际控制器。我已经修复了这些东西,但他们感觉像黑客让我不高兴,让我觉得我错过了什么。

一个有成效的事情可能是看一些开源iPhone项目(见this question)。但除此之外?

更新

澄清一下:我想我所问的可归纳为“iPhone开发的食谱和陷阱”。开发人员感兴趣的东西,但我见过的任何iPhone书籍都没有涉及,例如:

  • 我正在编写一个iPad应用程序,并希望向用户呈现一个只有某些的UISplitViewController,Apple似乎在说我做不到。可能吗?怎么样?

  • Apple没有给我一种方便,全面的方式来设计我的应用程序的方式(例如字体调整或颜色)。如何设计我的应用程序样式?

  • UIViewController方法名称中的一些不一致性(例如,viewDidUnload 与viewDidLoad相反,尽管有名称),内存管理也不容易。有没有一致的简单方法来整理它并使视图控制器内存管理不易出错?

  • 当出现内存警告时,如何能够始终如一地轻松测试我的视图控制器是否正常运行?在模拟器中模拟内存警告很容易,但是如果我要测试的UI正在显示(并且是一个“叶级”视图控制器),它将不会卸载它的视图,因为它当前是可见的。

N.B。我实际上并没有在这里问上面的问题 - 我觉得我对他们有很好的答案! - 举几个例子说明这个堆栈溢出问题的“好”问题。

4 个答案:

答案 0 :(得分:4)

在iTunes U(http://developer.apple.com/videos/wwdc/2010/)上提供的WWDC会谈有一些关于结构化的很好的信息,特别是在应用程序框架部分。

如果您正在谈论代码,请使用模型/视图/控制器模式,就像在大多数Web应用程序中一样:

  • 模型代码定义程序代表的对象。例如,时间跟踪器应用程序可能具有Task,TimeSlice和User等模型对象(特别是在网络设置中)。
  • 使用iOS SDK提供“免费”视图代码,除非您需要专门的视图代码。这些是UIImageView,UIButton等。
  • 控制器代码桥接模型和视图之间的“间隙”。控制器将更改视图以反映用户选择的模型,并便于选择模型对象。

这是任何iPhone应用程序的基本设计模式,也是最常用的应用程序模式。

另一方面,如果您参考我们公司所谓的UX(用户体验)设计,那么您无法在Apple iOS SDK文档集中击败Apple HIG指南,{{3}或者在“帮助”菜单中的Xcode中。

我推荐的另一件事就是玩一些测试/虚拟代码。没有什么可以顶级体验。尝试使用iOS SDK并亲自动手,可以让您真正了解设计应用程序的最佳方法。

编辑:

  

此外,委托方法(例如与方向更改相关)将转到顶部切换台视图控制器,而不是负责当前视图的实际控制器。

你能澄清一下吗?在我编写的所有应用程序中,当前显示的视图控制器接收方向更改方法。请注意,有两种方法。 shouldAutorotateToInterfaceOrientation:允许您决定视图是否应该旋转,didRotateFromInterfaceOrientation:允许您在必要时重新布局视图。

答案 1 :(得分:1)

请浏览此链接。在这方面,他们已经清楚地解释了设计模式。

http://www.raywenderlich.com/46988/ios-design-patterns

答案 2 :(得分:0)

您可能需要考虑在iTunes U上观看斯坦福大学CS193p课程等视频。他们深入探讨了iOS开发中最重要的部分,并提供了一些源代码。

答案 3 :(得分:0)

据我所知,没有一本书或资源可以处理我正在寻找的那种高级陷阱和食谱。存在大量有用的资源,但只是没有解决我正在考虑的问题。