标签:
我们知道UITableView没有像UIButton那样可以通过addTarget方法来监听touch事件,因此在某些场合,特别是在UITableViewCell中包含UITextField的时候,我们很有可能想通过点击UITableView的其他地方来取消UITextField的焦点。也许有朋友会说,使用UITapGestureRecognizer手势来取消焦点,这样是可以行得通,但是如果TextField中有clearButton或者其自定义的Button的时候,手势就会吸收掉事件了,导致按钮无效。
因此,我想到的做法就是重写UITableView的touch相关的方法,然后通过委托的方式提供给外部对象使用。首先定义Delegate:
| 01 | @protocol
 TouchTableViewDelegate <NSObject> | 
| 02 | 
| 03 | @optional | 
| 04 | 
| 05 | -
 (void)tableView:(UITableView
 *)tableView | 
| 06 |      touchesBegan:(NSSet
 *)touches | 
| 07 |         withEvent:(UIEvent
 *)event; | 
| 08 | 
| 09 | -
 (void)tableView:(UITableView
 *)tableView | 
| 10 |  touchesCancelled:(NSSet
 *)touches | 
| 11 |         withEvent:(UIEvent
 *)event; | 
| 12 | 
| 13 | -
 (void)tableView:(UITableView
 *)tableView | 
| 14 |      touchesEnded:(NSSet
 *)touches | 
| 15 |         withEvent:(UIEvent
 *)event; | 
| 16 | 
| 17 | -
 (void)tableView:(UITableView
 *)tableView | 
| 18 |      touchesMoved:(NSSet
 *)touches | 
| 19 |         withEvent:(UIEvent
 *)event; | 
| 20 | 
| 21 | 
| 22 | @end | 
然后UITableView的子类加入一委托对象,并重写所有touch相关方法,如下:
| 1 | @interface 
 TouchTableView : UITableView | 
| 2 | { | 
| 3 | @private | 
| 4 |     id
 _touchDelegate; | 
| 5 | } | 
| 6 | 
| 7 | @property
 (nonatomic,assign) id<TouchTableViewDelegate> touchDelegate; | 
| 8 | 
| 9 | @end | 
| 01 | @implementation
 TouchTableView | 
| 02 | 
| 03 | @synthesize
 touchDelegate = _touchDelegate; | 
| 04 | 
| 05 | -
 (void)touchesBegan:(NSSet
 *)touches withEvent:(UIEvent *)event | 
| 06 | { | 
| 07 |     [super
 touchesBegan:touches withEvent:event]; | 
| 08 |      | 
| 09 |     if([_touchDelegate
 conformsToProtocol:@protocol(TouchTableViewDelegate)] && | 
| 10 |         [_touchDelegate
 respondsToSelector:@selector(tableView:touchesBegan:withEvent:)]) | 
| 11 |     { | 
| 12 |         [_touchDelegate
 tableView:self touchesBegan:touches withEvent:event]; | 
| 13 |     } | 
| 14 | } | 
| 15 | 
| 16 | -
 (void)touchesCancelled:(NSSet
 *)touches withEvent:(UIEvent *)event | 
| 17 | { | 
| 18 |     [super
 touchesCancelled:touches withEvent:event]; | 
| 19 |      | 
| 20 |     if([_touchDelegate
 conformsToProtocol:@protocol(TouchTableViewDelegate)] && | 
| 21 |         [_touchDelegate
 respondsToSelector:@selector(tableView:touchesCancelled:withEvent:)]) | 
| 22 |     { | 
| 23 |         [_touchDelegate
 tableView:self touchesCancelled:touches withEvent:event]; | 
| 24 |     } | 
| 25 | } | 
| 26 | 
| 27 | -
 (void)touchesEnded:(NSSet
 *)touches withEvent:(UIEvent *)event | 
| 28 | { | 
| 29 |     [super
 touchesEnded:touches withEvent:event]; | 
| 30 |      | 
| 31 |     if([_touchDelegate
 conformsToProtocol:@protocol(TouchTableViewDelegate)] && | 
| 32 |         [_touchDelegate
 respondsToSelector:@selector(tableView:touchesEnded:withEvent:)]) | 
| 33 |     { | 
| 34 |         [_touchDelegate
 tableView:self touchesEnded:touches withEvent:event]; | 
| 35 |     } | 
| 36 | } | 
| 37 | 
| 38 | -
 (void)touchesMoved:(NSSet
 *)touches withEvent:(UIEvent *)event | 
| 39 | { | 
| 40 |     [super
 touchesMoved:touches withEvent:event]; | 
| 41 |      | 
| 42 |     if([_touchDelegate
 conformsToProtocol:@protocol(TTWTableViewDelegate)] && | 
| 43 |         [_touchDelegate
 respondsToSelector:@selector(tableView:touchesMoved:withEvent:)]) | 
| 44 |     { | 
| 45 |         [_touchDelegate
 tableView:self touchesMoved:touches withEvent:event]; | 
| 46 |     } | 
| 47 | } | 
| 48 | 
| 49 | @end | 
重写touch方法时必须把父类实现方法写上,否则UITableViewCell将无法正常工作。所有的改写工作如上所示,新的TableView类具有touch事件响应了,使用方法也很简单在原有UITableView的基础上赋予touchDelegate委托即可取到touch事件响应。如下:
| 01 | -
 (void)loadView | 
| 02 | { | 
| 03 |     [super
 loadView]; | 
| 04 |     TouchTableView
 *tableView = [[TouchTableView alloc]initWithFrame:CGRectMake(0.0, 0.0, 320, 460)   style:UITableViewStyleGrouped]; | 
| 05 |     tableView.touchDelegate
 = self; | 
| 06 |     //相关处理 | 
| 07 |     [self.view
 addSubview:tableView]; | 
| 08 |     [tableView
 release]; | 
| 09 | } | 
| 10 | 
| 11 | 
| 12 | -
 (void)tableView:(TTWTableView
 *)tableView | 
| 13 |      touchesEnded:(NSSet
 *)touches | 
| 14 |         withEvent:(UIEvent
 *)event | 
| 15 | { | 
| 16 |     //touch结束后的处理 | 
| 17 | } | 
标签:
原文地址:http://blog.csdn.net/xiaochao062/article/details/43489241