indexPathForCell获取错误问题

当使用UITableView或UICollectionView等集合控件时,如果你在这些控件的cell中添加了button或其他需要响应点击事件的控件。

你肯定希望能获取到当前点击点击的是哪个button。最常见有两种方法获取点击button的索引index:

1、设置button的tag值为它所在的cell的索引

    这个方法就不多介绍了,最常用的就是这种方法。

2、获取button对应的cell,再使用indexPathForCell接口取cell在集合控件中的索引

    这里面有个坑,假设在storyboard中button是cell的子节点,使用如下代码:

    UICollectionViewCell *curCell = (UICollectionViewCell *)sender.superview;

    NSIndexPath *curIndexPath = [self.allIconCollectionView indexPathForCell:curCell];

    输出curIndexPath.row的值,发现永远为0,再改为如下代码:

    UICollectionViewCell *curCell = (UICollectionViewCell *)sender.superview.superview;

    NSIndexPath *curIndexPath = [self.allIconCollectionView indexPathForCell:curCell];
    输出curIndexPath.row的值,终于取到正确值了,泪崩啊~

    推出原因是cell与tableview中多了一层,或button与cell中多了一层。大家自己去研究喽。

 //2015-01-08补充

1、使用自定义的UITableViewCell的子类时,可以用button的tag值来判断点击的button所在cell的索引,请在

cellForItemAtIndexPath中将button的tag值设置成indexPath.row

2、如果在cellForItemAtIndexPath中直接通过viewWithTag值来获取对应的控件来修改UI,这时tag值已有用途,那么请自定义一个UIButton的子类,新增一个NSInteger index属性来存储button所在的cell索引,并正确维护这个index属性

3、通过button.superview的方法来获取对应的cell,此方法不可取,因为不同的ios系统,UITableViewCell的结构不同

4、也可以使用自定义的UITableViewCell的子类,通过这个自定义cell的delegate方法,将cell本身回传给viewController来判断索引

posted @ 2014-01-07 18:19  瘦夹鲁尼  阅读(842)  评论(0编辑  收藏  举报