纠正手势识别器的MVC模式

时间:2012-09-19 13:38:25

标签: objective-c ios model-view-controller

我正在创建一个自定义手势识别器,我的目标是在手势持续时间内将运动记录在特定阈值以上,然后在手势结束时报告该数据集。关于手势识别器对象所扮演的角色,我有点模糊。

由于我对OOP还有点新意,我想知道MVC使用这个手势识别器的最佳实践。具体来说,如果手势识别器是“哑”并且仅向视图控制器报告移动,并且让逻辑和日志记录发生在VC中,或者它是否与光逻辑和登录手势识别器一样好,那么就让它在手势结束时回报,并让VC向手势识别器询问数据。

以下是我目前正在进行原型设计的一些示例代码(使用逻辑和登录手势识别器的方法):

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    if (self.state == UIGestureRecognizerStateFailed) return;

    CGPoint nowPoint = [[touches anyObject] locationInView:self.view];
    int xMovement = nowPoint.x - self.previousPoint.x;
    int yMovement = nowPoint.y - self.previousPoint.y;

    if (xMovement >= 0) {
        // positive/no x movement, log points if x or y has movement above threshold
        if (xMovement > MovementThreshold || yMovement > MovementThreshold) {
            NSLog(@"Movement above the threshold!\nx: %f\ty: %f", nowPoint.x, nowPoint.y);
            self.previousPoint = nowPoint;
        }
    } else {
        // negative x movement
        self.state = UIGestureRecognizerStateFailed;
    }
}

3 个答案:

答案 0 :(得分:1)

我认为手势识别是MVC视图组件的一部分。但最终,您可能打算在模型数据的显示方面做一些事情。您可以考虑使用委托模式来提供与控制器层的交互。

因此,托管手势识别器的自定义视图可以处理屏幕上与视图相关的方面,同时通过委托协议将模型含义委派给控制器层。

答案 1 :(得分:1)

我要记录手势识别器对象。我这样看。

如果我想在其他任何地方使用此手势识别器,我该怎么办?如果您的日志记录位于视图控制器中,则必须剪切并粘贴该代码。如果日志记录在手势识别器中,则只需创建手势识别器的新实例。

如果我想从此视图控制器中删除手势识别器,我需要做什么?同样,如果你的日志代码在视图控制器中,那将会有更多的工作。

封装告诉我,我想将我的代码保存在手势识别器中。

也就是说,您的手势识别器不必是单个对象。它可能很小。一个用于手势识别器本身,一个用于记录操作,一个用于存储数据。这实际上取决于每项任务的复杂程度。如果每个新数据点只是向一个数组添加一个数字,那么将它分开似乎为时过早,但如果它的数据你想要独立于手势识别器本身传递,那么最好打破它它出来了。

如果你决定做出错误的选择,那就是重新分解的原因。 :)

答案 2 :(得分:0)

感谢您的回答。

我将采用的方法是具有与手势识别器在手势识别器中的工作方式相关的逻辑,并使用委托模式在数据完成后处理数据。