2012-05-02 24 views
2

我需要帮助,了解如何从UIViewController中抽象出只是交互。对于所有的意图和目的,比如我有一个视图控制器来控制一个谜题。我有一系列的片断视图,拼图板视图(放置棋子的地方)以及其他一些视图。现在我有了那些拼图的典型泛式互动。如何从UIViewController中抽象出交互?

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

我对iOS很新,实际上一般都没有OO的经验,所以我真的希望有更多经验丰富的人员给我建议,以免我的代码弄糟了。 (是的,我会采取一个快照,但我还是感到很紧张。)无论如何,我想也许我应该做这样的事情:

  • 有将保持强劲的指针我的意见根视图控制器和照顾相关
  • 有在根视图控制器的交互控制器的指针,其职责是处理所有交互代码
  • 交互控制器将获得通过委托其观点从根视图控制器一切非互动通过授权运行时间并将任何手势识别器等附加到视图中viewDidLoad
  • T他的交互控制器将在运行时切换出来。可接受的交互控制器对象将来自我为此定义的一些UIInteractionViewController的子类。

我不知道这是否会

一)实际工作

B)是最好的方式做到这一点

C)足够快,以真正在运行时

工作

d)可扩展(我可能需要许多这些不同的'模式')。

其实,我看的越多,我越怀疑它的意义。帮助,令人愉快。

谢谢!

回答

0

好问题。

从我的角度来看,面向对象是应用程序开发的一个关键点。很多应用程序开发人员根本没有太多的面向对象的经验,这导致了很多关于SO的误解,烦恼,奇怪的问题和答案。首先,对Cocoas框架的基本架构以及如何使用它们缺乏了解,因为这些框架在许多方面都遵循继承和对象组合的思想,并且使用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: //... 
    } 
} 
+0

嗯。好的,是的,我明白你关于保持简单的观点。其实我真的很想避免开关语句,大声笑,但它确实会更直接。使用controlMode属性,您的解决方案也可以保持事物的美好和干净。我想我会按照你描述的方式去做。非常感谢你的帮助! – mwiederrecht