iOS子视图捕获到的touches如何让父视图响应

来源:互联网 发布:注册成为淘宝卖家 编辑:程序博客网 时间:2024/05/10 00:35
用代理实现最简单了,子视图声明一个protocol和与之对应的method和delegate property,然后父视图实现。
例如:
子视图SonView.h:
@class SonView; //这个必不可少,因为真正的class interface在下面声明,而在protocol声明中又要用到这个class,所以提前告诉XCode有这么一个class存在

@protocol SonViewTouchHandler <NSObject> //子视图声明protocol,只声明接口,不实现

- (void)SonViewTouchDownPoint: (CGPoint)touchPoint from:(id)sender;
- (void)SonViewTouchUpPoint: (CGPoint)touchPoint from:(id)sender;

@end


@interface SonView : UIView

@property (nonatomic, weak) id <SonViewTouchHandler> sonViewTouchHandlerDelegate; //delegate property代理 property,子视图用这个来访问父视图,这个变量的指向一般由父、子两个视图的创建者来设置

@end

父视图DadView.m:
@interface DadView () <SonViewTouchHandler> //此处父视图声明自己实现子视图的protocol

@end

@implementation DadView
//这两个在子视图protocol中声明方法在父视图中才真正实现,这就实现了子视图在不需要了解父视图的具体实现方法的情况下向父视图传送信息,此处传送的是子视图上用户触摸的位置信息
- (void)sonViewTouchDownPoint: (CGPoint)touchPoint from:(id)sender
{
...
}
- (void)sonViewTouchUpPoint: (CGPoint)touchPoint from:(id)sender
{
...
}

@end

子视图SonView.m

@implementation
//在子视图被用户触摸时呼叫父视图代理处理触摸事件,把用户触摸的位置信息通过代理发送给父视图
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch * touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self];
[self.sonViewTouchHandlerDelegate sonViewTouchDownPoint: touchPoint from:self];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//类似上面只是使用另一个对应的method
}

@end

以上就是一个典型的利用代理从子视图向父视图传值的具体实现方法。只要在合适的时候(一般是创建之后)把子视图sonView.sonViewTouchHandlerDelegate设置为父视图就可以了,如果子视图是由父视图创建的,则直接就是sonView.sonViewTouchHandlerDelegate = self就可以了 
1 0
原创粉丝点击