项目里有这么个问题,在 tableView 的 cell 上添加按钮,因为涉及到 cell 的重用,cell 上的按钮也会被重用。比如,用 tableView 显示一些需要下载的条目,每个条目右侧可安放一个“下载”按钮,这个按钮就是会被重用的。按钮有响应事件,那就得在响应事件里区分是哪个 button 的响应事件。
通常在 tableView 的代理方法里给button设置不同的tag(button自己本身有tag属性),然后就可以根据这个tag来区分响应的button事件。响应事件里默认的一个参数就是(id)sender,实际上也就是(UIButton*)sender
这个sender就是button对象自己。用 [sender tag] 作为switch的参数可区分相应的事件。
我之前是这么想的,因为 button 是加在 cell.contentView 上的,用方法[cell.contentView viewWithTag:tag]就可以取出相应的button。具体操作如下:
<span style="white-space:pre"> </span><span style="font-size:18px;">NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; //取出indexPath
UIButton *btn = (UIButton *)[[self.tableView cellForRowAtIndexPath:indexPath].contentView viewWithTag:0]; </span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> //用相应的indexPath来找相应的cell
[btn setEnabled:NO]; //可以设置相应的button属性了</span>
今天完成清除地图缓存里的bug修改。bug表现为:上述的cell上的按钮,点击清除缓存后仍然可以继续点击,因为button是共用的,不太好处理点击事件,需要分别设置不同的状态变量来区分。
状态:
typedef enum whichAlertViewToShow
{
SearchHistoryCacheClearUpType,
clearUpSearchHistorySuccessed,
clearUpSearchHistoryFailed,
MapCacheClearUpType,
ClearUpMapCacheSuccessed,
clearUpMapCacheFailed,
}AlertViewToShowType;
定义变量
BOOL _isSearchHistoryCacheClearUp;
BOOL _isMapCacheClearUp;
AlertViewToShowType _showType;
初始化
_isSearchHistoryCacheClearUp = NO;
_isMapCacheClearUp = NO;
button的响应事件函数
-(void)pressRouteCalculate:(UIButton*)sender
{
switch ([sender tag])
{
case 0:
if (!_isSearchHistoryCacheClearUp)
{
_showType = SearchHistoryCacheClearUpType;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"是否清除搜索历史记录"
delegate:self];
[alert show];
[alert release];
}
break;
case 1:
if (!_isMapCacheClearUp) {
_showType = MapCacheClearUpType;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"是否清除地图缓存"
delegate:self];
[alert show];
[alert release];
}
break;
default:
break;
}
}
警告框的done按钮响应的代理方法
-(void)clickDoneButton:(CMAlertView *)alertView
{
if (_showType == SearchHistoryCacheClearUpType)
{
if([[CMHistoryRecordCenter shared] removeWithType:CMHistoryRecordTypeKeySearch])
{
_isSearchHistoryCacheClearUp = YES;
_showType = clearUpSearchHistorySuccessed;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"已经清除搜索历史记录!"
delegate:nil];
[alert show];
[alert release];
[self.tableView reloadData];
}
else
{
_isSearchHistoryCacheClearUp = NO;
_showType = clearUpSearchHistoryFailed;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"清空失败!"
delegate:nil];
[alert show];
[alert release];
}
}
else if (_showType == MapCacheClearUpType)
{
if([[SystemConfig shared] deleteMapCache])
{
_isMapCacheClearUp = YES;
_showType = ClearUpMapCacheSuccessed;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"地图缓存已经清空!"
delegate:nil];
[alert show];
[alert release];
[self.tableView reloadData];
}
else
{
_isMapCacheClearUp = NO;
_showType = clearUpMapCacheFailed;
CMAlertView * alert = [[CMAlertView alloc] initWithTitle:@"提醒"
message:@"清空失败!"
delegate:nil];
[alert show];
[alert release];
}
}
}
还修改了下载离线地图以及路口放大图的进度条显示问题等。