1

我有一个 UIViewController,它的视图有一个自定义子视图。

此自定义子视图需要跟踪触摸事件并报告滑动手势。

目前我把 touchesBegan、touchesMoved、touchesEnded 和 touchesCancelled 放在子视图类中。通过一些额外的逻辑,我可以获得滑动手势并调用我的 handleRightSwipe 和 handleLeftSwipe 方法。所以现在当我在子视图中滑动时,它会调用它的本地滑动处理方法。这一切都很好。

但我真正需要的是在视图控制器中的 handleRightSwipe 和 handleLeftSwipe 方法。我可以将它们留在子视图类中,但是我必须同时引入所有逻辑和数据,这打破了 MVC 的想法。

所以我的问题是有没有一种干净的方法来处理这个问题?本质上,我想将我的触摸事件方法保留在子视图中,以便它们仅触发该特定视图。但我也希望在这些触摸事件(或在本例中为滑动手势)发生时通知视图控制器。

有任何想法吗?

谢谢。

更新:

使用 Henrik 的建议,这是我所做的一个快速示例(为您节省阅读时间):

我将视图控制器设置为通知的观察者(早期)。

// NOTIFICATION_LEFT_SWIPE is defined as some unique string elsewhere.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

// Note that imageView is the instance of my subview that is calling the notification.
// You can set this to nil if you don't want it to be specific.
[nc addObserver:self selector:@selector(handleLeftSwipe) name:@NOTIFICATION_LEFT_SWIPE object:imageView];

然后我实现了 handleLeftSwipe 方法。这将在收到通知时调用。

现在在我的子视图中,当收到滑动手势时我会发送通知:

// Note that NOTIFICATION_LEFT_SWIPE is the same one used in the view controller
// I put this in a global header I use.  This is how you keep track of notifications.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@NOTIFICATION_LEFT_SWIPE object:self]; 

同样对于右滑动。

4

2 回答 2

1

您可以使用通知中心向不同(观察)对象发送通知。

于 2010-06-16T19:51:34.750 回答
1

您还可以使用 OS 3.2 及更高版本中提供的手势识别器系统;手势识别器可让您将触摸处理与视图类分离,并且专为您在这里所做的事情而设计。在这种情况下,您将创建一个 的实例UIPanGestureRecognizer,将您的控制器添加为识别器的目标(使用通常的-addTarget:action:语法),然后使用 .将识别器添加到您的视图中-addGestureRecognizer:。然后,当用户在视图上滑动时,您的控制器会收到一系列调用它的操作消息,并且可以通过调用识别器的-translationInView:方法来检查移动。

于 2010-06-16T20:43:26.233 回答