2

我需要帮助理解如何从UIViewController. 出于所有意图和目的,假设我有一个控制拼图的视图控制器。我有一系列拼图视图、拼图板视图(放置拼图的地方)以及其他一些杂项视图。现在我与这些拼图有典型的泛式交互。

我需要做的是将交互抽象出来,这样我就可以在单击按钮或调用方法时完全改变整个系统的“交互模式”,可以说是整个系统的“交互模式”,同时保持一切状态否则它在切换之前的确切位置。例如,在切换之后,他们不必用手指拖动棋子,而是必须“选择”一个棋子,然后利用陀螺仪的重力滑动它。

我对 iOS 还很陌生,实际上总体上几乎没有 OO 经验,所以在我破坏我的代码来解决这个问题之前,我真的想从更有经验的人那里得到一些建议。(是的,我会拍个快照,但我还是很紧张!)无论如何,我在想也许我应该做这样的事情:

  • 有一个根视图控制器,它可以保留指向我的视图的强指针并处理所有与非交互相关的事情
  • 在该根视图控制器中有一个指向交互控制器的指针,该控制器的工作是处理所有交互代码
  • 交互控制器将在运行时通过委托从根视图控制器通过委托获取其视图,并将任何手势识别器等附加到 viewDidLoad 中的视图
  • 交互控制器将在运行时关闭。可接受的交互控制器对象将来自我为此目的定义的某些 UIInteractionViewController 的子类。

我不知道这是否会

a) 实际工作

b) 做最好的方法

c) 足够快以在运行时真正工作

d) 可扩展(我可能需要许多不同的“模式”)。

事实上,我越看我写的东西,我就越开始怀疑它的意义。救命,求救。

谢谢!

4

2 回答 2

1

好问题。

在我看来,OO 是应用程序开发的关键点。许多应用程序开发人员根本没有太多的OO经验,这导致在SO上出现很多误解,烦躁,奇怪的问题和答案。首先是对Cocoas框架的基本架构以及如何使用它们缺乏了解,因为它们在很多方面都遵循继承和对象组合的思想,并利用了OO模式。这种缺乏会导致与框架的广泛斗争和/或(当学习第一个 OO 课程时)关于 OO 概念的完全过度设计。

对于您的问题:您似乎已经对基本的 OO 原则有了足够的了解,可以了解框架内部发生了什么。现在您应该注意保持简单。你的益智游戏听起来像一个典型的应用程序:你一个人或几个人一起工作,整个代码库会很小,它不是一个库,它的生命周期会很短,一旦完成,你将修复错误并拥有小改进,但不适应完整的新环境等等。所以我认为你不应该对问题中描述的问题大量使用 OO 模式(即使我猜所描述的解决方案会起作用)。

我会做这样的事情:

  1. 让你的puzzel的视图控制器通过实现所有需要的东西来完成所有的事件处理,比如:

    touchesBegan, touchesMoved, touchesEnded,accelerometer:didAccelerate:

  2. 给这个控制器一个模式并按下按钮打开它:

    int controlMode; // in PuzzleController.h

  3. 在事件处理中打开控制模式,如下所示:

例子

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      touchedPiece = [self findPiece:event];
    case ControlModeGravity:
      //do nothing;
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      [self moveTouchedPiece:event];
    case ControlModeGravity:
      //do nothing;
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  switch (controlMode)
  {
    case ControlModeDrag:
      touchedPiece = nil; 
    case ControlModeGravity:
      touchedPiece = [self findPiece:event]; 
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
  switch (controlMode)
  {
    case ControlModeDrag:
      //do nothing 
    case ControlModeGravity:
      [self moveTouchedPiece:accelaration]; 
    case ControlModeSomethingElse:
      // whatever
    default: //...
  }
}
于 2012-05-02T09:41:24.763 回答
0

通读这个..希望它会有所帮助。
http://borkwarellc.wordpress.com/2010/07/22/qff-kitchen-mvc-part-1/

于 2012-05-02T09:39:00.473 回答