Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何保持模型和;控制器是否与基于CALayer的UI分离?_Objective C_Cocoa_Cocoa Touch_Calayer - Fatal编程技术网

Objective c 如何保持模型和;控制器是否与基于CALayer的UI分离?

Objective c 如何保持模型和;控制器是否与基于CALayer的UI分离?,objective-c,cocoa,cocoa-touch,calayer,Objective C,Cocoa,Cocoa Touch,Calayer,我正试图重新实现一个旧的,我写了一点时髦的用户界面。我看了Jens Alfke的GeekGameBoard代码以寻求灵感,CALayers看起来是实现UI的方法 然而,GeekGameBoard代码中没有模型和视图的清晰分离;模型是视图,这使得很难复制游戏状态以便对AI玩家执行游戏树搜索。然而,我似乎无法找到一种替代的结构方式,这种方式允许模型和视图分离,而不需要一场持续的战斗来保持两个平行网格(打开模型,一个用于视图)同步。当然,这也有其自身的问题 如何最好地实现AI搜索友好型模型结构和显示友

我正试图重新实现一个旧的,我写了一点时髦的用户界面。我看了Jens Alfke的GeekGameBoard代码以寻求灵感,CALayers看起来是实现UI的方法

然而,GeekGameBoard代码中没有模型和视图的清晰分离;模型是视图,这使得很难复制游戏状态以便对AI玩家执行游戏树搜索。然而,我似乎无法找到一种替代的结构方式,这种方式允许模型和视图分离,而不需要一场持续的战斗来保持两个平行网格(打开模型,一个用于视图)同步。当然,这也有其自身的问题

如何最好地实现AI搜索友好型模型结构和显示友好型视图之间的关系?如有任何建议/经验,将不胜感激。我害怕/半期待着一个类似“没有好的答案:尽你所能处理它”这样的答案,但我准备好了要大吃一惊


谢谢你的回答,彼得。然而,我不完全确定我是否完全理解它。我可以看到,如果你只是有一组初始的片段被移动,甚至被移除,那么当一个人放下一个新片段时会发生什么呢?它是否会这样工作:

  • 用户在视图中单击
  • 视图点击被转换为电路板位置并通知控制器
  • 控制人与继任国一起创建一个新的董事会(如果合适,即这是一个合法的举动)
  • 视图通过其绑定拾取新板,撕裂现有视图/层层次结构,并将其替换为当前状态
  • 听起来对吗


    PS:很抱歉没有指明是iPhone还是Mac。我最感兴趣的是适用于iPhone的东西,但如果我能让它首先在Mac上很好地工作,我相信我自己可以调整解决方案来适用于iPhone。(或者提出一个新问题!)

    理论上,它应该与基于NSView的UI相同:添加一个或多个模型属性,将其作为绑定公开,然后通过控制器将视图(层)绑定到模型

    例如,您可能有一个棋盘类,上面有棋子(每个棋子都有一个对拥有它的玩家的引用),所有这些都是模型类。您的控制器将拥有一块板,并且您的视图/层将能够显示一块板,可能每个板都有一个子视图/子层

    您需要将线路板视图/层绑定到控制器的
    线路板
    属性,并在视图/层的该属性设置器中,为每个工件创建子视图/子层,并将其绑定到工件所需的任何属性。(更换主视图/图层板时,不要忘记解除绑定并删除所有子视图/子图层。)

    当您想要移动或修改一个工件时,您可以使用它自己的属性来移动或修改它;这些将转换为视图/图层上的特性访问。表面上,您将设置层的属性以设置更改的动画(例如,更改一个片段的
    位置
    将导致该层相应地移动)

    董事会也是如此。您可以让用户更改一种或两种瓷砖颜色;您将通过游戏控制器将颜色井绑定到其棋盘对象,并将视图/层绑定到同一棋盘的相同属性,它将自动拾取更改

    免责声明:我从未在任何方面使用过核心动画,如果你问的是Cocoa Touch而不是Cocoa,上述解决方案将不起作用,因为它依赖于Cocoa绑定。

    我知道几乎所有界面都是使用核心动画CALayers构建的,我使用的模式与Peter描述的非常类似。他是正确的,因为您希望将Calayer视为NSView/UIView,并通过控制器和模型对象管理其逻辑和数据

    在我的例子中,我创建了一个控制器对象的层次结构,它也可以作为模型对象(我可以重构以分离模型组件)。每个控制器对象都管理一个CALayer,因此最终会有一个与模型控制器的CALayer显示层次结构并行的CALayer显示层次结构。对于我的应用程序,我需要对使用此层次结构构造的方程执行计算,因此我使用控制器从树的底部向上提供计算值。控制器还处理用户编辑事件,例如插入新的子操作或删除操作树


    我创建了一个layer hosting view类,它允许CALayer树响应触摸或鼠标事件(其源现在在项目中可用)。对于您的boardgame示例,CALayer棋子可以接收触摸事件,并让其控制器管理后端逻辑(确定合法移动等)。你应该能够在每次移动时都不拆下任何东西的情况下移动棋子并维护相同的控制器。

    不,你不会创建新的棋盘;你可以创建一个新的块并将其添加到板中。你必须决定是在电路板上执行这两个步骤(即,让控制器告诉电路板“在x,y位置制作并添加一个新的部件”)还是单独执行(即,让控制器自己创建部件,然后将其传递给电路板)。你可能仍然可以在iPhone上使用我的建议,但你没有绑定,因此,您必须直接使用KVO。线路板层观察线路板的属性,而工件层观察其各自工件的属性。应该不会太痛,但我还没试过。