On View和ViewController的责任和沟通

时间:2012-01-23 02:49:15

标签: ios model-view-controller

我正在开发一款纸牌游戏iPhone应用程序,并且对于通信方法和各种组件的责任都有疑问。

在我的应用程序中,ViewController中的viewWillAppear创建View类的实例并对其进行初始化。 ViewController创建视图并强烈指向它。

[self setGameView:[[GameView alloc] initWithFrame:CGRectMake(0, 0, 480, 300)]];

在GameView中,我在视图上布置卡片并确保它们可以根据某些规则移动。

几个问题:

鉴于某些卡可以“击败”其他卡,View或View Controller是否应该负责此决定?例如,此时,任何卡都可以放在任何卡的顶部,只要它们位于同一区域,但是,有时,卡应该快速恢复,而其他时候程序应该识别该卡已经击败了另一张卡。 / p>

在这种情况下,View应该通知其控制器“卡A放在卡B的顶部 - 如果A实际击败B,请弄清楚”。如果Controller决定A不能击败B,那么Controller应该指示它的视图将A捕捉回堆栈,就好像A确实击败B一样,它应该保持原样并且其他一些事情应该发生?

这里应该如何进行沟通?

我想在它的 - viewWillAppear方法中,ViewController应该订阅NSNotificationCenter,要求在下一次将卡放在另一张卡的顶部时知道。由于View由ViewController拥有,因此它可以访问所有公共接口方法,并可以从中找出哪些卡位于何处以及原因。

NSNotification是处理此问题的好方法,还是有更好的方法来做到这一点?

从我的问题可以看出,我在这里有点困惑。请帮我澄清一下。

1 个答案:

答案 0 :(得分:1)

首先,我要说View或ViewController都不负责卡片的行为方式。这应该是模型的领域。阅读Model View Controller核心能力。另请查看Communicating with Objects

View应该将用户操作提供给Model,模型应告诉View如何反应。

对于传递信息的实际实现,NSNotifcations是一个有效的选择。然而,还有其他选择,例如创建自定义protocols协议是另一种做事方式。它们需要定义一个委托对象来完成协议支持的消息。

如果您打算使用NSNotifications,我会将其构造为:

  

在初始化时,模型订阅“用户更改”事件

     

在View的loadView()上,View订阅了“Card change”事件

     

在View的viewWillAppear()方法中,View发送并“更新   请求“(作为整体”用户更改“)回复模型   通过一系列“卡片更改”将卡片布置在屏幕上,   View收到然后尽职尽责地显示卡片

     

在游戏过程中,用户界面发送“用户更改”事件   模型响应更多“卡片更改”事件

这种结构将视图和模型分开,从而使代码和调试变得更加清晰。然后,ViewController将执行View Controller之类的操作,例如显示可能显示hi分数历史记录等的其他View Controller。

使用协议执行上述操作需要创建“用户更改”和“卡更改”协议,模型实现“用户更改”协议,View实现“卡更改”协议。然后,Model将View作为其委托,View将把Model作为其委托。