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