如何从UIViewController中抽象出交互?

时间:2012-05-02 07:35:58

标签: ios uiviewcontroller

我需要帮助了解如何从UIViewController中抽象出来的互动。对于所有意图和目的,假设我有一个控制拼图的视图控制器。我有一系列的片段视图,拼图板视图(放置片段的地方),以及一些其他杂项视图。现在我与那些拼图有着典型的泛风格互动。

我需要做的是抽象出这种互动,以便我可以通过点击按钮或调用方法,完全改变整个系统的“交互模式”,同时保持切换之前的所有其他状态。例如,在开关之后,他们不必用手指拖动碎片,而是必须“选择”一块,然后用陀螺仪重力滑动它。

我对iOS很陌生,实际上一般都没有OO经验,所以我真的需要一些经验丰富的人的建议,然后我会破坏我的代码来解决这个问题。 (是的,我会拍一张快照,但我还是很紧张!)无论如何,我想也许我应该这样做:

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

我不知道这是不是

a)实际工作

b)是最好的方法

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

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

实际上,我越看我写的内容,就越开始怀疑它的意义。帮助,pleeeeeze。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好问题。

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

对于您的问题:您似乎已经充分了解了基本的OO原则,以了解框架内部正在发生的事情。现在你应该知道保持简单。你的益智游戏听起来像一个典型的应用程序:你单独工作或很少人在上面工作,整个代码库很小,它不是一个库,它的生命周期会很短,一旦完成你就会修复bug并且很小改进,但不适应完整的新环境等。所以我认为你不应该为问题中描述的问题大量使用OO模式(尽管我猜所描述的解决方案可行)。

我会做这样的事情:

  1. 让你的puzzel的视图控制器执行所有事件处理 实现所需的所有事情,如:

    touchesBegantouchesMovedtouchesEndedaccelerometer:didAccelerate:

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

    int controlMode; // in PuzzleController.h

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

  4. 实施例

    -(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: //...
      }
    }