MVC对象引用

时间:2010-07-01 15:50:40

标签: objective-c model-view-controller

我使用MVC建立了一个项目(更具体地说,这是来自斯坦福的Hello Poly第2部分) 而且我在引用对象时遇到问题。

所以我有Model,它是PolygonShape类,Controller - controller和View - PolygonView 我在Controller中做了出口:

IBOutlet PolygonShape *myShape;  
IBOutlet PolygonView *myView;

并在awakeFromNib中实现我初始化myShape

myShape = [[PolygonShape alloc] initWithNumberOfSides:x minimumNumberOfSides:3 maximumNumberOfSides:12];  

然后我想以某种方式了解

myShape.numberOfSides  

PolygonView的内部界面我有

IBOutlet PolygonShape *myShape;  

@property (retain) PolygonShape *myShape;  

但实际情况是,PolygonView中的myShape实际上并不是同一个对象,即使我认为我在Interface Builder中设置了正确的连接

按照MVC说明,我无法使模型直接与视图进行通信,因此如何从PolygonView访问myShape?

1 个答案:

答案 0 :(得分:1)

首先,PolygonView的myShape不一定是IBOutlet,PolygonShape也不应该是myShape。在awakeFromNib(控制器)中,就在你现在的情况下,添加

[myView setMyShape:myShape];

对于视图来说,了解模型是完全可以接受的,而不是相反。所以在PolygonView中,说myShape.numberOfSides是完全可以接受的,因为毕竟它有一个指向PolygonShape的指针,因此'知道'PolygonShapes及其所有方法。如果您担心myView将如何了解myShape的更改,您只需要调用类似-[PolygonView setNeedsDisplay:YES]的方法,或者更多地涉及更多内容,编写刷新方法或其他内容。基本上,模型 - 视图 - 控制器的概念首先是所有交互都应该通过Controller,所以每当它更新模型时,它也只是告诉相关的视图刷新。 (其中一些使用绑定变得更容易,顺便说一下,但这只能在MacOS上暂时使用。)