注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

水木的博客

唱好人生中的每一场戏

 
 
 

日志

 
 

自定义 UITableViewCell 的 accessory 样式  

2012-05-07 23:16:26|  分类: Iphone&Ipad开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用默认的accessory图标,实现点击默认的accessory图标后,触发tableView的cell选中事件,步骤如下:

1、设置:cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;


2、

-(void)tableView:(UITableView *)tableView1 accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{

    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

    [self tableView:tableView didSelectRowAtIndexPath:indexPath];

}



以下为其他相关方面的参考资料:


对于 UITableViewCell 而言,其 accessoryType属性有4种取值:

UITableViewCellAccessoryNone,

UITableViewCellAccessoryDisclosureIndicator,

UITableViewCellAccessoryDetailDisclosureButton,

UITableViewCellAccessoryCheckmark

分别显示 UITableViewCell 附加按钮的4种样式:

 无、

 

除此之外,如果你想使用自定义附件按钮的其他样式,必需使用UITableView 的 accessoryView 属性。比如,我们想自定义一个 

的附件按钮,你可以这样做:

UIButton *button ;

if(isEditableOrNot){

UIImage *image= [UIImage   imageNamed:@"delete.png"];

button = [UIButton buttonWithType:UIButtonTypeCustom];

CGRect frame = CGRectMake(0.00.0, image.size.width, image.size.height);

button.frame = frame;

[button setBackgroundImage:imageforState:UIControlStateNormal];

button.backgroundColor= [UIColor clearColor];

cell.accessoryView= button;

}else {

button = [UIButton buttonWithType:UIButtonTypeCustom];

button.backgroundColor= [UIColor clearColor];

cell.accessoryView= button;

}

这样,当 isEditableOrNot 变量为 YES 时,显示如下视图:

 

但仍然还存在一个问题,附件按钮的事件不可用。即事件无法传递到 UITableViewDelegate 的accessoryButtonTappedForRowWithIndexPath 方法。

也许你会说,我们可以给 UIButton 加上一个 target。

好,让我们来看看行不行。在上面的代码中加入:

[button addTarget:self action:@selector(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];

然后实现btnClicked方法,随便在其中添加点什么。

点击每个 UIButton,btnClicked 方法中的代码被调用了!一切都是那么完美。

但问题在于,每个 UITableViewCell 都有一个附件按钮,在点击某个按钮时,我们无法知道到底是哪一个按钮发生了点击动作!因为addTarget 方法无法让我们传递一个区别按钮们的参数,比如 indexPath.row 或者别的什么对象。addTarget 方法最多允许传递两个参数:target和 event,而我们确实也这么做了。但这两个参数都有各自的用途,target 指向事件委托对象——这里我们把 self 即 UIViewController实例传递给它,event 指向所发生的事件比如一个单独的触摸或多个触摸。我们需要额外的参数来传递按钮所属的 UITableViewCell 或者行索引,但很遗憾,只依靠Cocoa 框架,我们无法做到。

但我们可以利用 event 参数,在 btnClicked 方法中判断出事件发生在UITableView的哪一个 cell 上。因为 UITableView 有一个很关键的方法 indexPathForRowAtPoint,可以根据触摸发生的位置,返回触摸发生在哪一个 cell 的indexPath。 而且通过 event 对象,我们也可以获得每个触摸在视图中的位置:

// 检查用户点击按钮时的位置,并转发事件到对应的accessorytapped事件

- (void)btnClicked:(id)senderevent:(id)event

{

NSSet *touches =[event allTouches];

UITouch *touch =[touches anyObject];

CGPointcurrentTouchPosition = [touch locationInView:self.tableView];

NSIndexPath *indexPath= [self.tableView indexPathForRowAtPoint:currentTouchPosition];

if (indexPath!= nil)

{

[self tableViewself.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];

}

}

这样,UITableView的accessoryButtonTappedForRowWithIndexPath方法会被触发,并且获得一个indexPath 参数。通过这个indexPath 参数,我们可以区分到底是众多按钮中的哪一个附件按钮发生了触摸事件:

-(void)tableView:(UITableView*)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath{

int* idx= indexPath.row;

//在这里加入自己的逻辑

??

}



转自:http://blog.csdn.net/kmyhy/article/details/6442351

  评论这张
 
阅读(1184)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017