外部获取IndexPath的几种方式(关联对象等)

来源:互联网 发布:3d心形程序c语言 编辑:程序博客网 时间:2024/05/19 00:37

一、单击某个cell中的button获取indexPath

1、 一般方式
     - (void)buttonAction:(UIButton *)sender     {        UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview];         NSIndexPath *indexPath = [_tableView indexPathForCell:cell];          NSLog(@"indexPath is = %i",indexPath.row);      }
2、runtime添加属性方式,即关联对象的方式
    //runtime 关联对象     这种方式首先引入#import <objc/runtime.h>     - (UITableViewCell *)tableView:(UITableView *)tableVie cellForRowAtIndexPath:(NSIndexPath *)indexPath     {         static NSString *identiStr = @"cellID";         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identiStr];         if (cell == nil)         {            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identiStr];            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];            button.frame = CGRectMake(0, 0, 100, 33);            [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];            [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];            button.tag = 110 + indexPath.row;            [cell.contentView addSubview:button];          }          UIButton *button = (UIButton *)[cell.contentView viewWithTag:110];         //runtime 关联对象         objc_setAssociatedObject(button, @"button", indexPath, OBJC_ASSOCIATION_ASSIGN);         [button setTitle:dataSource[indexPath.row] forState:UIControlStateNormal];         return cell;          }    //事件触发 runtime 获取关联的对象     - (void)buttonAction:(UIButton *)sender     {        //runtime 获取关联的对象        UITableViewCell *cell = objc_getAssociatedObject(sender, @"button");        NSIndexPath *indexPath = [_tableView indexPathForCell:cell];        NSLog(@"indexPath is = %ld",indexPath.row);     }

二、已知具体row,获取indexPath

- (void) refreshLessTime{    for (int row = 0; row < leftTimeArr.count; row ++)    {          NSIndexPath *indexPath = [NSIndexPath indexPathForItem: row inSection:0];          UITableViewCell *cell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:indexPath];          UILabel *remainingTimeLabel = (UILabel *)[[cell.contentView viewWithTag:500] viewWithTag:501];          remainingTimeLabel.text = [leftTimeArr objectAtIndex:indexPath.row];     }}
0 0