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

6
有很多关于iPhone编程的资源。其中大部分涉及“我该如何做X”,例如“设置导航控制器”或“从URL下载文本”。这些都很好。
现在我更感兴趣的是关于简单内容之后的问题——如何最佳结构化你的复杂UI、你的应用程序或常见问题。举个例子:像《Beginning iPhone 3 Development》这样的书告诉你如何设置一个带有顶部“切换器”视图控制器的多视图控制器应用程序,它可以在其他视图控制器拥有的视图之间进行切换。不错,但只是告诉你如何做,没有提到可能出现的问题:例如,如果我使用他们的范例切换到一个UINavigationViewController,导航栏会出现在屏幕上方而过低,因为UINavigationViewController期望成为最顶层的UIViewController(显然)。此外,委托方法(例如与方向变化有关的方法)会传递到顶部切换器视图控制器,而不是实际负责当前视图的控制器。我有解决这些问题的方法,但它们看起来像是hack,这让我感到不满意,让我觉得我漏掉了什么重要的东西。

我建议您查看一些开源的iPhone项目(请参见this question)。但除此之外呢?

更新

为了澄清:我想问的可以总结为“iPhone开发的技巧和注意事项”。这些技巧和注意事项对开发者很有用,但是在我看过的任何iPhone书籍等资料中都没有涉及,例如:

  • 我正在开发一款iPad应用程序,希望只有在某些时候向用户展示UISplitViewController,但苹果似乎在说我不能这样做。是否可能?如何实现?

  • 苹果没有给我提供方便的跨平台方式来为我的应用程序进行样式设计(例如字体调整或颜色)。我该如何处理我的应用程序样式?

  • 由于UIViewController方法名称的不一致性(例如,viewDidUnload并不是viewDidLoad的相反,尽管名称是这样的),内存管理变得更加困难。是否有一种一致且简单的方法来整理它,并使视图控制器内存管理更少出错?

  • 如何一致且轻松地测试我的视图控制器在收到内存警告时是否正确行为?在模拟器中模拟内存警告很容易,但如果我想要测试的UI正在显示(而且是“叶级”视图控制器),则它不会被卸载,因为它当前可见。

注意:我实际上并没有在此处提出上述问题 - 我认为我对它们有合理的答案! - 只是举例说明了这个stackoverflow问题的“好”问题。


1
你知道你可以隐藏导航控制器栏...如果你正在使用两个导航控制器,并将其中一个推入另一个,则必须隐藏其中一个导航栏。 - Daniel
有时候不幸的是,视图控制器的旋转可能不会被触发,因为它们只在最顶层的视图控制器上调用,但是您可以注册旋转通知并相应地进行处理。 - Daniel
谢谢Daniel。监听旋转事件的问题在于,你最终要自己处理UI重新定位(包括坐标系转换等),这是一个非常棘手的问题,我不想再次陷入其中(曾经不得不做过)。 - occulus
完全同意你的观点。相比其他一些语言/框架,iPhone/Objective-C世界缺乏设计模式。到目前为止,我读过的书籍主要集中在“教程”方面。 - wanghq
4个回答

4
在iTunes U上提供的WWDC演讲(位于http://developer.apple.com/videos/wwdc/2010/)包含了一些关于结构的有用信息,特别是在应用程序框架部分。
如果你在谈论代码,那么像大多数Web应用程序一样使用模型/视图/控制器模式:
- 模型代码定义程序表示的对象。例如,时间跟踪应用程序可能具有Task、TimeSlice和User等模型对象(尤其是在网络设置中)。 - 视图代码已经在iOS SDK中“免费”提供,除非您需要专门的视图代码。这些包括UIImageView、UIButton等。 - 控制器代码连接模型和视图之间的“差距”。控制器将更改视图以反映用户选择的模型,并促进模型对象的选择。
这是任何iPhone应用程序的基本设计模式,也是大多数人会使用的模式。
如果您想要了解我们公司所称的UX(用户体验)设计,那么您可以查看苹果iOS SDK文档集中的Apple HIG指南,该文档可在网上或从帮助菜单中的Xcode中获取。另外,我强烈建议您尝试一些测试/虚拟代码,因为没有什么比实践更重要。通过使用iOS SDK并亲自动手,您将真正学习到最佳的应用程序设计方式。
编辑:
引用: “此外,委托方法(例如与方向更改相关的方法)应该发送到顶部切换器视图控制器,而不是实际负责当前视图的控制器。”
您能澄清一下吗?在我编写的所有应用程序中,当前显示的视图控制器都会接收到方向更改方法。请注意,有两种方法。shouldAutorotateToInterfaceOrientation:允许您决定视图是否旋转,didRotateFromInterfaceOrientation:允许您重新布局视图(如果需要)。

嗨,安德鲁,感谢你的回答。我已经更新了问题,以便更好地表达我的想法。 - occulus
我仍然在努力寻找我所说的信息,但同意你提出的实践经验非常有用和重要的好观点,因此接受这个答案。 - occulus

1

0
据我所知,目前还没有一本书或资源涉及我正在寻找的高级技巧和实用技巧。虽然有很多有用的资源存在,但它们并没有涉及我所考虑的内容。

0
你可能想要考虑观看类似于斯坦福大学在iTunes U上的CS193p课程的视频。他们深入讲解了iOS开发的最重要部分,并提供了一些源代码。

iTunes U的学习资料确实非常有用。但是它们似乎仍然涵盖了这个问题的“错误”层面——即深入细节,正如您所提到的。我更多地谈论的是关于UI结构的高级应用程序设计策略,以及类似的内容。 - occulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接