我需要帮助来了解如何仅从UIViewController中抽象出交互。出于所有意图和目的,请说我有一个控制拼图的视图控制器。我有一系列的零件视图,一个拼图板视图(放置零件的地方)以及其他一些其他视图。现在,我可以与这些拼图块进行典型的平移式交互。

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

我对iOS还是很陌生,总体而言实际上很少有OO经验,因此我真的想从更有经验的人那里得到一些建议,然后再利用我的代码来弄清楚。 (是的,我会快照,但是我仍然很紧张!)无论如何,我在想也许我应该做这样的事情:

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

  • 我不知道这是否会

    a)实际工作

    b)做到最好

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

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

    实际上,我越看我写的东西,就越开始怀疑它的意义。求助,请加油。

    谢谢!

    最佳答案

    好问题。

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

    提出一个问题:看来您已经对OO的基本原理学到了足够的知识,以了解框架内发生了什么。现在您应该意识到保持简单。您的益智游戏听起来像是一个典型的应用程序:您单独工作或很少有人在上面工作,整个代码库很小,它不是一个库,它的生命周期会很短,一旦完成,您将修复错误并拥有很小的空间改进,但不适应完整的新环境等。因此,我认为您不应该针对问题中描述的问题大量使用OO模式(即使我认为所描述的解决方案会起作用)。

    我会做这样的事情:

  • 让您的puzzel的视图控制器执行以下所有事件处理:
    实现所有需要的东西,例如:
    touchesBegantouchesMovedtouchesEndedaccelerometer:didAccelerate:
  • 为该控制器提供一种模式,并在按下按钮时将其打开:
    int controlMode; // in PuzzleController.h
  • 在事件处理中打开控制模式,如下所示:

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

    关于ios - 如何从UIViewController中抽象出交互?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10409549/

    10-13 04:17