MVC和它们之间的通信。我错过了什么?

时间:2009-08-03 02:59:47

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

嘿所有,试图学习目标-c。它很顺利,直到我意识到我错过了一个链接。

当建立在MVC的精神中时,我理解它,因为你的模型和视图不应该互相交谈。

我有这个问题我现在搞乱了。

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

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

  • 包含视图的视图 多边形。

现在,这就是问题出现的地方。视图需要有关模型中对象的信息。我怎么做到的?我试过一些IBOutlet,但从来没有让它起作用。

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

我希望你们中的一些人可以为我澄清这一点,并告诉我你应该如何继续这样做。

谢谢大家和晚安! :)

4 个答案:

答案 0 :(得分:8)

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

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

基本上,控制器的目的是将信息从视图传递到模型,并确保它们保持同步。

答案 1 :(得分:1)

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

该模型将内部表示其保持独立所需的一切。

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

答案 2 :(得分:1)

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

或者如果你想在模型和视图之间进行非常松散的耦合,请尝试键值观察:你的模型会发出一条通知,说“嘿,我的边数变为8”,你的视图会监听这些通知并根据需要重新绘制

另一种选择是为视图提供委托(=您的控制器),然后在视图类中调用类似[delegate numberOfSidesToDraw]的内容。

这三种方法都有利有弊。

答案 3 :(得分:0)

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

我忘了提到我正在使用CG和drawrect绘制多边形。

我想做什么,如果我理解正确的话,我应该做的是从控制器传递numberOfSides到视图,要求它用这么多边绘制。像:

[查看drawPolygon:myPolygon.numberOfSides];

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

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