【问题标题】:How to abstract out the interaction from a UIViewController?如何从 UIViewController 中抽象出交互?
【发布时间】:2012-05-11 16:18:28
【问题描述】:

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

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

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

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

不知道会不会这样

a) 实际工作

b) 做最好的方法

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

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

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

谢谢!

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

    好问题。

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

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

    我会这样做:

    1. 让您的 puzzel 的视图控制器通过以下方式处理所有事件 实现所有需要的东西,例如:

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

    【讨论】:

    • 嗯。好的,是的,我明白你关于保持简单的观点。我实际上是在尝试避免使用 switch 语句,哈哈,但这确实会更直接。使用 controlMode 属性,您的解决方案也确实使事情变得干净整洁。我想我会按照你描述的方式做。非常感谢您的帮助!
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 2018-10-22
      • 2013-09-22
      相关资源
      最近更新 更多