2

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

由于我对 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;
    }
}
4

3 回答 3

1

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

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

于 2012-09-19T13:48:08.367 回答
1

我会登录手势识别器对象。我是这样看的。

如果我想在其他任何地方使用这个手势识别器进行日志记录,我需要做什么?如果您的日志记录在视图控制器中,那么您必须剪切并粘贴该代码。如果日志记录在手势识别器中,您只需创建手势识别器的新实例。

如果我想从此视图控制器中删除手势识别器,我需要做什么?同样,如果您的日志记录代码在视图控制器中,则工作量会更大。

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

也就是说,您的手势识别器不必是单个对象。可以是小套装。一种用于手势识别器本身,一种用于记录行为,另一种用于存储数据。这实际上取决于每个任务的复杂程度。如果每个新数据点只是将一个数字添加到数组中,那么将其分开似乎还为时过早,但如果它是您想要独立于手势识别器本身传递的数据,那么打破它可能会更好出来。

如果你决定你做出了错误的选择,那就是重构的目的。:)

于 2012-09-19T13:52:24.590 回答
0

感谢您的回答。

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

于 2012-09-19T21:50:28.793 回答