【问题标题】:How does the Model-View-Controller pattern apply to iPhone development?Model-View-Controller 模式如何应用于 iPhone 开发?
【发布时间】:2011-05-31 06:30:47
【问题描述】:

最近我一直在阅读 MVC 模式并希望将其应用到我的 iPhone 开发中。但是,该模式似乎有很多变体,我不确定应该如何应用它。

据我所知,视图将通知控制器已执行的任何操作,然后控制器将更新数据模型(如果需要)。每当数据发生更改时,数据模型都会通知视图,然后视图会适当地更新它的数据显示。

在这个基本模型中,控制器只知道数据模型。但是,我似乎不知道如何在我的 iPhone 应用程序中使用这种设计。

以下页面建议了该模式的替代版本,其中控制器了解数据模型和视图,并且模型和视图之间的所有通信都通过控制器执行。这似乎也表明模型和视图可以访问控制器。我是否建议数据模型通过某种形式的通知(通知或 KVO)与控制器交互,而视图通过操作与控制器交互?

第二个模型正确吗?

http://www.bogotobogo.com/DesignPatterns/mvc_model_view_controller_pattern.html

非常感谢,

丹尼

【问题讨论】:

标签: iphone cocoa-touch model-view-controller


【解决方案1】:

我发现 Paul Hegartys 对 iOS 中 MVC 的解释非常有帮助。 see his Stanford iTunes U video。 MVC 从第 22 分钟开始。

编辑
视频的链接并没有按预期将您带到那里。它是1。 Cocoa Touch、Objective-C、工具和 MVC 简介(2010 年 9 月 21 日)

【讨论】:

  • 我发现这个视频非常有帮助,而且该系列中的所有视频...必须阅读
  • 那个视频确实很有帮助。为发布它干杯! :) 也非常感谢所有其他海报。我觉得我现在有了更好的理解。
【解决方案2】:

MVC 已经存在了很长时间,因此该模式存在许多变化(或错误引用)。不过,对于我见过的大多数 MVC 实现来说,这些概念都差不多。

我将重点介绍 Apple 如何定义 MVC。可以在Cocoa Design Patterns 指南和从 SDK 站点下载的示例代码(MVCNetworking 示例)中找到。

在 iOS 中,您通常会拥有模型和视图控制器(它们是控制器和视图的合并角色)。

此外,Martin Fowler 在他的GUI Architectures 中有一些很棒的 MVC 内容。

【讨论】:

    【解决方案3】:

    iOS 开发非常面向 MVC 模式。

    通常使用 viewControllers 和模型来完成。视图在 Interface Builder 中构建,分配给控制器,模型部分从其他地方检索。

    我想说,对于 Cocoa-Touch,模式的第二个“版本”是最能描述通常情况的那个。

    MVC 背后的理念是模型和视图是可重用的,但控制器通常适合手头的问题。 对于 iOS 开发也是如此,尤其是在您使用界面生成器时。

    视图通过操作/委托连接到 viewController,模型通过 KVO 通知或通过控制器拉取新数据来广播其更改。

    Apple 开发者门户网站提供了大量代码,您应该先查看其中的一些代码。让你的眼睛和思想都在寻找 MVC 模式,你会发现他们一直在使用它,委托模式在顶部以提供更好的事件抽象

    【讨论】:

      【解决方案4】:

      在我看来,第二个更好。模型和视图应该完全分离。如果视图收到模型的通知,视图将取决于模型的设计。通过在此处放置控制器,创建了紧密耦合的循环依赖。 最后,每个部分都不能独立开发,分而治之的策略根本无法使用。

      我对一般情况的建议:

      • 尽可能使视图和模型被动和独立。重大突变必须仅通过外部操作来完成。不应主动更改。
      • 让控制器主动控制它们和其他控制器。

      在 iOS 中,UIView 是一个完全被动的视图。在大多数情况下,所有主要的突变总是由 UViewController 在外部完成。模型部分应该完全按照你的意愿自己实现。 (或者你可以将模型集成到控制器中,如果它足够小,但我不推荐它)

      在一些大的特色 UIView 中,使用了子规模的 MVC 模式。分形!

      【讨论】:

        猜你喜欢
        • 2015-05-14
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 2014-01-10
        • 2011-12-04
        • 1970-01-01
        • 2012-02-10
        • 2017-06-27
        相关资源
        最近更新 更多