代码之家  ›  专栏  ›  技术社区  ›  Leonardo

含可可粉的mvc/objective-c

  •  0
  • Leonardo  · 技术社区  · 16 年前

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

    我使用了许多带有MVC思想的Java Web框架,Spring和Struts ECC…所以我习惯使用servlet或控制器,它将属性传递给jsp页面,这就是视图。 在带有jstl的jsp页面中,可以调用此属性并呈现为视频。 这样,控制器和视图(理论上)就被清楚地分开了。

    使用xcode,我可以很容易地识别用ibuilder构建的控制器和视图。 我找到的所有教程都显示了控制器,它可以直接更改标签或文本字段。

    所以我有两个问题:

    1. 在我看来,两者(控制器和视图)之间没有分离,我错在哪里?
    2. 有没有一种方法可以让控制器以j2ee的方式将所有对象打包到一种上下文中,并让视图读取该上下文?

    谢谢 利奥纳多

    2 回复  |  直到 16 年前
        1
  •  0
  •   rebo    16 年前

    在你读过的大多数例子中,你可能看到这样的东西:

    [myTextfield setStringValue:myString];
    

    在这种情况下,确保控制器直接更新文本字段,但是由于mytextfield通常是iboutlet,所以它可以是视图中的任何文本字段,甚至可以是nil。很可能它甚至不需要知道它是一个nstextfield,只要它响应一个setStringValue方法。从这个意义上讲,控制器和视图是分离的。

    在上面的评论中,您关注的是mvc中职责的分离,但并没有太多提到这个模型。使用cocoa绑定,您可以直接绑定到模型密钥路径,在这种情况下,模型不需要知道任何关于视图的信息。

    mvc是一个模棱两可的概念,没有严格的定义。对不同的人来说可能意味着不同的事情。对我来说,这意味着视图对控制器的了解(通过出口或绑定)对模型的了解有限(通过绑定)。控制者对模型有充分的了解,对视图的了解有限(通过出口)。最后,模型对视图的知识为零,理想情况下对控制器的知识为零。

    关于您的第二个问题,我不使用j2ee,但是我认为您可以通过让控制器更新一个上下文ivar(可能是nsdictionary),然后在您的视图中用一个keypath绑定到这个上下文来实现您的要求。但是没有必要把所有的东西都包装起来绑定是非常多版本的,你可以绑定到任何属性。

        2
  •  1
  •   James Williams    16 年前

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

    Cocoa没有强制执行MVC;它只是强烈地鼓励它——特别是对于大型项目。以一个示例程序为例,该程序具有绑定到nsarraycontroller的nstableview。

    在本例中,nstableview显然是视图(它的名称中有“view”一词),nsarraycontroller显然是控制器(它的名称中有“controller”一词)。

    模型是nsarray,nsarraycontroller知道它,但是您可能不会直接与该模型交互。相反,您将要求nsarraycontroller通过向数组控制器(而不是数组本身)发送addobject:和removeobject:消息来操作其模型。

    执行此操作时,nsarraycontroller将通过绑定在nstableview中影响更改。同样,您也不会要求nstableview做任何事情。

    所以你从不跟风景说话,也从不跟模特说话。你想发生的一切都会通过控制器。

    MVC。QED。

    当然,也许项目的工作方式,视图应该是它自己的控制器。世界不会结束,尽管你可能会发现,要违背框架的基本原则会更困难一些。但是,您应该始终尝试使用最好的方法来完成手头的工作,而不是坚持某种设计模式的纯粹性。

    推荐文章