我需要帮助了解如何从UIViewController
中抽象出来的互动。对于所有意图和目的,假设我有一个控制拼图的视图控制器。我有一系列的片段视图,拼图板视图(放置片段的地方),以及一些其他杂项视图。现在我与那些拼图有着典型的泛风格互动。
我需要做的是抽象出这种互动,以便我可以通过点击按钮或调用方法,完全改变整个系统的“交互模式”,同时保持切换之前的所有其他状态。例如,在开关之后,他们不必用手指拖动碎片,而是必须“选择”一块,然后用陀螺仪重力滑动它。
我对iOS很陌生,实际上一般都没有OO经验,所以我真的需要一些经验丰富的人的建议,然后我会破坏我的代码来解决这个问题。 (是的,我会拍一张快照,但我还是很紧张!)无论如何,我想也许我应该这样做:
我不知道这是不是
a)实际工作
b)是最好的方法
c)足够快到真正在运行时工作
d)可扩展(我可能需要许多不同的“模式”)。
实际上,我越看我写的内容,就越开始怀疑它的意义。帮助,pleeeeeze。
谢谢!
答案 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模式(尽管我猜所描述的解决方案可行)。
我会做这样的事情:
让你的puzzel的视图控制器执行所有事件处理 实现所需的所有事情,如:
touchesBegan
,touchesMoved
,touchesEnded
,accelerometer: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: //...
}
}