发生子视图触摸事件时通知视图控制器

时间:2010-06-16 19:45:07

标签: iphone uiviewcontroller uiresponder

我有一个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]; 

同样适用于滑动。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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