iphone - 如何让每个类(class)互相交流?

标签 iphone model-view-controller

我需要帮助来了解iPad / iPhone环境中的MVC模型。不知何故,即使阅读了几次,我还是听不懂。

假设我要构建一个小型应用程序,用于存储图像位置以及每个图像的注释。我可能会创建一个存储这些信息的“ SZImage”类。除了setter和getter之外,我还需要实现其他方法吗?模型的作用是什么,它可以实现什么方法,它不能做什么?

之后,我将需要设置显示图像的界面。因此,我需要创建另一个名称为“ SZImageView”的类。此类的作用是什么?它是在iPhone窗口上绘制还是我将其留给控制器来完成工作。如果我留给控制器绘画,那为什么还要创建此类?

如果我需要让控制器成为模型和视图之间的桥梁,那么应该创建一个名称为“ SZImageViewController”的类。这堂课该怎么办?

最后,这是困扰我很久的那个。如何使用其他类中的方法向AppDelegate添加窗口?类内实例之间的交互如何完成。因为我看到AppDelegate通常非常简短。

最佳答案

模型-视图-控制器类的类别和示例

在模型视图控制器(MVC)中,应将每个类设计为适合这三类之一。这样,您可以避免类耦合并创建更灵活的代码。

模型类。
此类的类应表示应用程序的数据模型。如果应用程序是游戏,则代表玩家,敌人,关卡布局,保存的数据(例如记分板)等的类。但是,这些类应仅限于保存表示这些对象及其背后的逻辑的数据。例如,如果是赛车游戏,则“汽车”类应该是模型的一部分,并且应该代表汽车的所有属性(例如,速度,加速,转弯等)。此类还应包括汽车的所有必要逻辑,例如,确定汽车应如何运动(例如加速,折断,转弯)以及发生碰撞时应发生的情况的逻辑。该“汽车”类应注意定义如何向用户展示汽车。此类也不应涉及任何应用程序逻辑。它应该完全坚持描述要成为一辆汽车。

查看课程。
此类的类应表示应用程序向用户展示模型的方式。与前面的示例保持一致,属于该类别的类的示例将是“ MainMenu”,“ ScoreBoardView”和“ RenderingEngine”。 “ MainMenu”类确切地知道如何向用户显示选项列表以及如何看起来非常漂亮。还知道,当选择一个选项时,它应该稍微改变其视觉外观,例如一个按钮被“按下”。但是,此类不知道按下按钮时要执行的逻辑。这是控制器类的工作。因此,视图类只是让相关控制器知道用户已与用户界面进行交互(通过调用某些控制器方法或发出通知)。有关更多信息,请参见控制器部分。

“ ScoreboardView”还知道,当传递了一个由字符串和数字(​​玩家名称和分数)组成的字典(模型类)时,它将以一种特定的方式(可能是在表格中)呈现它们。它既不知道如何更新字典,也不知道如何计算平均分数。如果需要更多信息,则需要向控制器询问。然后,控制器的工作就是找出获取信息的方法。

最后,对于此部分,“ RenderingEngine”是视图类,因为它采用模型并为其产生视觉效果。就是这样。 RenderingEngine已编程为知道如何显示汽车,并且如果将汽车设置在特定位置,则应在该位置绘制它,或者如果汽车发生碰撞,则需要通过屈曲来绘制它。但是同样,它不知道如何更新汽车的位置,也不知道速度等等。

控制器类。
最后,正如我之前已经提到的那样,控制器是将所有内容组合在一起并为您的应用程序提供流程和控制的类。人们将控制器类称为应用程序的“大脑”,因为他们根据用户的输入(通过视图类进行引导)和数据模型(可通过模型类进行访问)进行决策。
控制器类控制应用程序的流程。他们将用户从“主菜单”转到“汽车选择屏幕”,再到“比赛轨迹”,再到“比赛”再转到“记分板屏幕”,依此类推!他们通过类对模型进行更改,并向视图类提供更改的反馈,以便这些类可以向用户呈现应用程序的当前状态。控制器有效地将模型和视图链接在一起,同时提供应用程序逻辑和程序工作流程。该程序工作流程还可以包括处理以下问题:从视图获取的输入与模型不正确匹配。该视图对模型了解甚少,无法提供必要的检查-这是控制器的工作之一。因此,将视图类与模型类直接链接通常被认为是不好的做法。在这三种类型的类中,控制器通常是互换性最低的类,但实际上,您希望交换最多的是视图和模型类。

结论。模型视图控制器设计模式允许开发人员逻辑上组织其工作和应用程序的组件。当使用模型视图控制器范例时,它可以保持灵活性,因为可以替换这三个组件中的任何一个,只要替换模块保持与其他两个组件希望能够交互的相同协议即可。 (当我说“协议”时,可以使用继承来实现此设计,或者在某些情况下,最好使用实际的协议声明并确保类确认适当的协议。)一个完美的例子是很多为Mac编写的应用程序可以轻松移至iOS,因为这两个平台之间的唯一主要区别在于用户界面级别,这完全可以理解,因为Mac的界面传统上是用户与之交互的大屏幕。另一方面,键盘和鼠标,iOS的界面由用户触摸以进行交互的小得多的屏幕组成。

进一步阅读。 The wikipedia page(当然!),MVC in the Apple Developer Documentation'Cocoa Design Patterns' by Erik M. Buck



我试图使这种解释对所有平台,框架和语言都相当通用。在iOS开发中,MVC设计被认为是至高无上的,以至于您必须对框架进行非常艰苦的工作才能避免使用MVC。视图类(UIView,UITableView,UIAlertView,UIImageView等)和控制器类(UIViewController,UITableViewController,UINavigationController等)与其余模型类(NSString,NSDate,NSManagedObjectContext,UIImage等)之间有明显的区别。 )。显然,每个类都属于这三个类别之一,可在您开发应用程序时实现代码重用和极大的灵活性。

更具体地说,与您的问题有关,您的AppDelegate将属于控制器类类别。它提供对应用程序关键事件的控制。启动应用程序时,何时退出,何时进入后台模式,依此类推。您的程序需要有一个地方,这些地方要处理这些事情,这是应该在这里实现的地方。

我希望这有帮助。我也强烈建议您查看有关Model-View-Controller范例的免费WWDC2010会话视频。

关于iphone - 如何让每个类(class)互相交流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231175/

相关文章:

java - Spring MVC。 JSP 不起作用

java - JTable 的 TableModelListener 如何工作?

iphone - 如何使用 iCloud 同步我的 sqlite 数据库和驻留在应用程序库文件夹中的文件夹中的图像

iphone - 如何防止 Xcode 4 在每次运行后跳转到 main.m 文件?

ios - NSFetchedResultsController 全部删除

iphone - 仅在 iPhone 上水平添加 UIPanGesture

javascript - 我应该如何延迟加载 Ext JS MVC Controller 、 View 、存储和模型?

iphone - 如何从给定字符串中获取数组中所有源 url 的值

javascript - backbone.js 每页有几个模型和 View

ruby-on-rails - 如何验证 Rails Controller 中的存在和正则表达式格式?