【问题标题】:How to keep model & controller separate from a CALayer based UI?如何将模型和控制器与基于 CALayer 的 UI 分开?
【发布时间】:2009-07-04 17:03:04
【问题描述】:

我正在尝试重新实现一个旧的Reversi board game,我用更时髦的 UI 编写。我查看了 Jens Alfke 的 GeekGameBoard 代码以获得灵感,而 CALayers 看起来像是实现 UI 的方法。

然而,在 GeekGameBoard 代码中,模型和视图并没有清晰的分离;模型视图,这使得例如制作游戏状态的副本以便为 AI 玩家执行游戏树搜索变得困难。但是,我似乎无法想出另一种结构方法,允许模型和视图分离,而不涉及保持两个平行网格的持续战斗(模型打开,视图一个) 同步。当然,这也有其自身的问题。

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


感谢彼得的回答。但是,我不完全确定我完全理解它。如果你只有一组初始的可以移动甚至移除的部件,我可以看到这是如何工作的,但是当一个人放下一个新部件时会发生什么?它会像这样工作吗:

  1. 用户在视图中点击。
  2. 查看点击转换为板位置并通知控制器。
  3. 控制器创建一个具有后续状态的新董事会(如果合适,即这是一个合法的举动)。
  4. 视图通过其绑定获取新板,拆除现有视图/层层次结构并将其替换为当前状态。

听起来对吗?

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

【问题讨论】:

  • 不,你不会创建一个新的董事会;您将创建一个新的 Piece 并将其添加到 Board。您必须决定是在 Board 中执行这两个步骤(即,让控制器告诉 Board“在 x,y 处制作并添加一个新 Piece”)还是分别(即让控制器自己创建 Piece,然后将其传递给董事会)。
  • 你可能仍然可以在 iPhone 上使用我的建议,但你不会有 Bindings,所以你必须直接使用 KVO。棋盘层观察棋盘的属性,棋子层观察各自棋子的属性。应该不会太痛,但我没试过。

标签: objective-c cocoa cocoa-touch calayer


【解决方案1】:

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

例如,您可能有一个带有 Pieces 的 Board 类(每个 Piece 都有对拥有它的玩家的引用),所有这些都是模型类。您的控制器将拥有一个 Board,您的视图/层将能够显示一个 Board,可能每个 Piece 都有一个子视图/子层。

您将板视图/层绑定到控制器的 board 属性,并在该属性的视图/层的设置器中,为每个部分创建一个子视图/子层,并将其绑定到 Piece 的任何属性它会需要。 (更换主视图/图层的Board时,不要忘记取消绑定并移除所有子视图/子图层。)

当你想移动或修改一个棋子时,你可以使用它自己的属性;这些将转换为视图/图层上的属性访问。从表面上看,您将设置图层的属性以对更改进行动画处理(例如,更改 Piece 的 position 将导致图层相应地移动)。

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

免责声明:我从未将 Core Animation 用于任何事情,如果您询问的是 Cocoa Touch 而不是 Cocoa,上述解决方案将不起作用,因为它依赖于 Cocoa Bindings。

【讨论】:

    【解决方案2】:

    我有an iPhone application,其中几乎所有界面都是使用 Core Animation CALayers 构建的,我使用的模式与 Peter 描述的非常相似。他是正确的,因为您希望将 CALayers 视为 NSViews / UIViews 并通过控制器管理它们的逻辑,并通过模型对象管理数据。

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

    我创建了一个图层托管视图类,它允许 CALayer 树响应触摸或鼠标事件(现在可以在 Core Plot 项目中找到其源代码)。对于您的棋盘游戏示例,CALayer 部件可以接收触摸事件,并让它们的控制器管理后端逻辑(确定合法移动等)。您应该能够四处移动部件并维护相同的控制器,而不会在每次移动时都拆掉所有东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多