【问题标题】:MVC and the communication between them. What did i miss?MVC 和它们之间的通信。我错过了什么?
【发布时间】:2009-08-03 02:59:47
【问题描述】:

大家好,正在努力学习objective-c。进展顺利,直到我意识到我错过了一个链接。

当以 MVC 的精神进行构建时,我理解它,因为模型和视图不应该互相交谈。

我现在遇到了这个问题。

  • 包含多边形类的模型。 包含一个多边形对象 numberOfSides 等属性。

  • 一个控制器,读取一些 UI 元素和修改模型。为了 例如 numberOfSides。

  • 一个视图,包含一个视图绘图 多边形。

现在,问题就出现在这里。视图需要来自模型的对象信息。我怎么得到它?我尝试了一些 IBOutlet,但从未成功。

我最终为视图创建了一个可以包含 numberOfSides 的属性。然后我会使用一个控制器方法,它会调用一个视图方法并设置 numberOfSides。

我希望你们中的一些人可以为我澄清一下,并告诉我应该如何进行。

非常感谢,晚安! :)

【问题讨论】:

    标签: objective-c iphone cocoa-touch model-view-controller object


    【解决方案1】:

    Cocoa 中的 MVC 与传统的 MVC 略有不同,所以我会用 Cocoa 的方式来回答。

    你有一个控制器对象,它有一个指向你的 Polygon 对象的指针。您的控制器还应该有一个指向您的视图的指针(很可能是通过 IBOutlet)。随着多边形的变化(无论是 numberOfSides 还是其他),控制器需要意识到这一点并将信息传递给视图。同样,如果允许视图更改 numberOfSides(假设您有一个滑块来增加边数),那么控制器需要知道该更改并将其传递给 Polygon 对象。

    基本上,控制器的目的是在视图和模型之间来回传递信息,并确保它们保持同步。

    【讨论】:

      【解决方案2】:

      在适当的 MVC 架构中传递的信息应该通过诸如事件管理器之类的中介来完成。

      该模型将具有保持独立所需的所有内容的内部表示。

      现在,当发生更改时,模型会通过事件管理器向视图发送事件。

      【讨论】:

        【解决方案3】:

        您还可以为视图提供只读多边形实例变量(只是指向控制器中多边形实例的指针;只读,因为您不希望视图能够更改模型)。这不一定违反 MVC 原则。

        或者,如果您希望模型和视图之间的耦合非常松散,请尝试键值观察:您的模型发送一个通知说“嘿,我的边数已更改为 8”,您的视图会监听这些通知并根据需要重绘自己.

        另一种选择是给您的视图一个委托(=您的控制器),然后从视图类中调用类似 [delegate numberOfSidesToDraw] 的东西。

        这三种方法各有利弊。

        【讨论】:

          【解决方案4】:

          我明白了。我的控制器有一个到视图和多边形的 IBOutlet。

          我忘了说我是用 CG 和 drawrect 来绘制多边形的。

          我想做的,如果我理解正确的话,我应该做的是从控制器将 numberOfSides 传递给视图,要求它使用这个数量的边进行绘制。喜欢:

          [查看drawPolygon:myPolygon.numberOfSides];

          但我必须做的是,因为 drawrect 会自动调用,所以我必须使视图的一些实例变量可用于包含控制器将设置的 numberOfSides。然后调用[view setNeedsDisplay];

          这有意义吗?由于视图无法直接访问 myPolygon。你会怎么处理?

          【讨论】:

            猜你喜欢
            • 2017-04-26
            • 1970-01-01
            • 2021-08-10
            • 1970-01-01
            • 1970-01-01
            • 2014-03-20
            • 1970-01-01
            • 1970-01-01
            • 2012-01-12
            相关资源
            最近更新 更多