我有一个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];
同样适用于滑动。
答案 0 :(得分:1)
您可以使用Notification Center向不同(观察)对象发送通知。
答案 1 :(得分:1)
您还可以使用手势识别器系统,该系统在OS 3.2及更高版本中可用;手势识别器可让您将触摸处理与视图类分离,并且几乎就是您在此处所做的事情。在这种情况下,您需要创建UIPanGestureRecognizer
的实例,将控制器添加为识别器的目标(使用通常的-addTarget:action:
语法),然后使用{{1}将识别器添加到视图中}。然后,当用户在视图中滑动时,您的控制器会收到一系列操作消息,并可以通过调用识别器的-addGestureRecognizer:
方法来检查移动。