现在开发ios程序都是用mvc模式,view层与control层之间的交互主要用到代理模式和target-action模式。这次讲讲代理模式和target-action的实现方法,作用,及什么情况下使用。
1:定义一个协议:如下代码。
@protocol UIGesturesViewProtocol@optional - (void)touchBegindid: (GestureView*)gestureView point:(CGPoint)point;//触摸开始时实现的方法(触摸点) - (void)touchMovedid: (GestureView*)gestureView;//触摸移动时出发方法 - (void)touchEnddid: (GestureView*)gestureView;//触摸结束时出发方法 @end
2:在界面(相当于view层)
@interface GestureView : UIView
@property(nonatomic,assign)id
@end
在GestureView中声明一个遵守我们自己定义的协议的属性。
3:重写继承的
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
如下代码
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.delegate respondsToSelector:@selector(touchBegindid: point:)]) { [_delegate touchBegindid:self point:[[touches anyObject] locationInView:self.superview]]; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.delegate respondsToSelector:@selector(touchMovedid:)]) [_delegate touchMovedid:self]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.delegate respondsToSelector:@selector(touchEnddid:)])//判断是否实现该方法如果没有实现则不进行调用函数 [_delegate touchEnddid:self]; }
4.自己定义一个RootViewController类 遵守UIGesturesViewProtocol协议,实现协议方法。代码如下:
-(void)touchBegindid:(GestureView *)gestureView point:(CGPoint)point{ NSLog(@"执行了%s,%@",__func__,NSStringFromCGPoint(point)); } -(void)touchMovedid:(GestureView *)gestureView{ // NSLog(@"%s",__func__); } -(void)touchEnddid:(GestureView *)gestureView{ // NSLog(@"%s",__func__); }以上就是一个完整的代理模式。
定义
@property(nonatomic,assign)id target; //类
@property(nonatomic,assign)SEL action; //上边的类调用的方法
实现部分:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
[self.targetperformSelector:self.actionwithObject:selfwithObject:touches];
}
target-action | 代理模式 | |
作用: | 解藕,通常是一系列事件 | 解藕,通常是一系列事件 |
场景 | 单个事件 | 需要多个事件 |