0

我用部分创建tableView,我使用自定义单元格并以这种方式用图像定义复选框(UIImageView):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"cellIdentifier";
    StandardCellWithImage *cell = (StandardCellWithImage *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil) {
        cell = [[StandardCellWithImage alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSeparatorStyleNone;
    }

    cell.checkbox.tag = indexPath.row;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didSelectedImageAtIndexPath:)];
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.delegate = self;
    [cell.checkbox addGestureRecognizer:tapGesture];
    cell.checkbox.userInteractionEnabled = YES;

    return cell;
}

在 didSelectedImageAtIndexPath 方法中我使用:

- (void) didSelectedImageAtIndexPath:(id) sender {
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:gesture.view.tag inSection:0];
}

但是我在这里只有一行,不知道用户在哪个部分点击了这一行。有没有可能认出来?

4

2 回答 2

2

如果您像这样在 view.tag 中编码项目/部分会怎样:

view.tag = indexPath.section * kMAX_SECTION_SIZE + indexPath.item;

那么你可以这样做:

- (void) didSelectedImageAtIndexPath:(id) sender {
  UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;


  NSIndexPath *indexPath = [NSIndexPath indexPathForRow:gesture.view.tag % kMAX_SECTION_SIZE
                                        inSection:int(gesture.view.tag / kMAX_SECTION_SIZE)];
}
于 2013-01-20T18:12:10.657 回答
1

不要在 cellForRowAtIndexPath 中的复选框(单元格中的按钮)上添加手势,而是在单元格(StandardCellWithImage)本身中实现按钮操作并从那里调用委托。

  1. 将操作设置为单元格中的按钮并在那里自行实现。
  2. 在单元格中声明一个协议并在其中声明您想要的方法作为 didSelectedImageAtIndexPath:
  3. 在你的视图控制器中实现这个协议
  4. 将 cellForRowAtIndexPath 中的单元格委托设置为 selt(视图控制器)
  5. 当您点击单元格中的复选框方法时,将调用您设置为复选框按钮的操作。
  6. 从那里调用委托方法 didSelectedImageAtIndexPath:。当然,您可以使用 [(UITableView *)self.superview indexPathForCell:self] 从那里返回 indexPath 对象。// 这里 self = 自定义单元对象

笔记:

您可以在单元格中存储对 tableView 的弱引用,您可以在表格数据源的 -tableView:cellForRowAtIndexPath: 中设置该引用。这更好,因为依靠 self.superview 始终完全是 tableView 是脆弱的。谁知道苹果未来会如何重新组织 UITableView 的视图层次结构。

于 2013-01-20T18:19:38.027 回答