繁体   English   中英

具有可可/目标C的MVC

[英]MVC with cocoa/objective-c

我有很强的j2ee背景,并且正在尝试使用Objective-c进行一些桌面/ iphone编程。

我使用过许多带有mvc,spring和struts ecc的Java Web框架...因此,我习惯于使用servlet或controller来将属性传递给jsp页面(即视图)。 在带有jstl的jsp页面中,您可以调用此属性并将其渲染为视频。 通过这种方式,控制器和视图(理论上)可以清晰地分开。

使用xcode,我可以轻松识别使用IBuilder构建的控制器和视图。 我发现的所有教程都向控制器显示了直接更改标签或文本字段的方法。

所以我有两个问题:

  1. 在我看来,两者(控制器和视图)之间没有分隔,我在哪里错了?
  2. 控制器是否可以通过j2ee方式将所有对象打包在某种上下文中并使视图读取该上下文?

谢谢莱昂纳多

我不明白您的第二个问题(我从未使用过J2EE),但是我认为我可以在回答您的第一个问题上取得一些进展。

可可不执行MVC。 它只是强烈鼓励这样做-特别是对于大型项目。 考虑一个示例程序,该程序具有绑定到NSArrayController的NSTableView。

在这种情况下,NSTableView显然是视图(名称中带有单词“ view”),而NSArrayController显然是控制器(名称中带有单词“ controller”)。

该模型是NSArrayController知道的NSArray,但是您可能不会直接与该模型交互。 您将改为通过向阵列控制器(而不是阵列本身)发送addObject:和removeObject:消息,要求NSArrayController操纵其模型。

执行此操作时,NSArrayController将通过绑定对NSTableView进行更改。 同样,您永远不会要求NSTableView做任何事情。

因此,您永远不会与视图交谈,也永远不会与模型交谈。 您想要发生的一切都通过控制器。

MVC。 QED。

当然,也许项目的工作方式是,视图应该是它自己的控制器。 世界不会终结,尽管您可能会发现违反框架的规定要困难一些。 但是您应该始终尝试使用最佳方法来完成工作,而不是坚持某种设计模式的纯度。

在您阅读的大多数示例中,您可能会看到以下内容:

[myTextfield setStringValue:myString];

现在,在这种情况下,请确保控制器直接更新了文本字段,但是由于myTextfield通常是IBOutlet,因此它可以是视图中的任何文本字段,甚至是nil。 很有可能,它甚至不需要知道它是一个NSTextfield,而只是响应setStringValue方法。 从这个意义上说,控制器和视图之间存在分隔。

现在,在上面的评论中,您担心MVC中的职责分离,但是并没有过多提及该模型。 使用Cocoa绑定,您可以直接绑定到模型关键路径,在这种情况下,模型可能根本不了解视图。

MVC有点模棱两可,没有硬性定义。 对于不同的人来说,这可能意味着不同的事情。 对我来说,这意味着视图对控制器的了解(通过出口或绑定)对模型的了解有限(通过绑定)。 控制器对模型有完整的了解,而对视图的了解有限(通过出口)。 最后,模型的视图知识为零,理想情况下,控制器的知识为零。

关于第二个问题,我不使用j2ee,但我认为您可以通过让控制器更新上下文ivar(可能是NSDictionary)来实现所需的功能,然后在您看来使用键路径将此上下文绑定到该上下文。 但是,没有真正必要将所有内容都打包起来,绑定非常实用,您可以绑定到任何属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM