知道选择了哪个单元格中的哪个按钮

Know which button in which cell is selected

我有一个包含 37 个对象的数组,这些对象必须列在表格视图单元格中。对于每个单元格,我都创建了自定义按钮。所以 37 个按钮。对于每个按钮,我都给了一个图像作为复选框。如果选择了一个按钮,图像就会改变。现在我想知道点击了哪个单元格中的哪个按钮。

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell..
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34, 4, 300, 30)];
    label.text=[categoryarray objectAtIndex:[indexPath row]];
    [cell.contentView addSubview:label];
    UIButton *cellbutton=[[UIButton alloc]initWithFrame:CGRectMake(0, 10, 20, 20)];
    cellbutton.tag=[indexPath row];
    [cellbutton setBackgroundImage:[UIImage imageNamed:@"bfrtick.png"] forState:UIControlStateNormal];
    [cellbutton addTarget:self action:@selector(button1Tapped:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:cellbutton];
    return cell;
}

创建一个包含 indexPath 行 (cellbutton.tag) 的 NSMutableDictionary 或 NSMutableArray,然后您可以根据需要进行处理。如果每个单元格对象都有 id ,那将是最好的,但这也可以。

此外,请记住每个单元格都是可重复使用的,您必须检查数组中是否存在特定按钮。否则,您可能会显示不一致的图像。

您可以为您的按钮设置标签

并且在 touchUpInside 处理程序中,您可以获得此标签并通过此标签从您的数据源获取所有数据,考虑到标签值是您的索引值。

例如: 在您的 tableviewCellForRowAtIndexPath 方法中:

button.tag = [indexpath row]; //assign current index value to your button tag

然后在您的 touchUpInside 处理程序上

- (IBAction)buttonTuouchedUpInside:(id)sender {

   UIButton *button = (UIButton*)sender; // convert sender to UIButton

   NSInteger index = button.tag; // get button tag which is equal to button's row index 

   NSObject *myDataEntry = [myDataArray objectAtIndex:index] 

   //do something with this data
}

由于您已经标记了您的按钮,在目标中,您可以使用发件人再次识别按钮,例如

-(void) onButtonPressed:(id)sender
{
    UIButton *button = (UIButton *)sender;
    NSLog(@"%d", [button tag]);
}

从按钮中,找到包含该按钮的单元格。从单元格中,您可以获得索引路径。从索引路径中,您可以获得数组索引。这将有效,而不必担心维护标签。

- (IBAction)button1Tapped:(UIButton *)button
{
    UIView *view = button;
    while (view && ![view isKindOfClass:[UITableViewCell class]]) {
        view = view.superview;
    }

    if (!view) {
        return; // The button was not in a cell
    }

    UITableViewCell *cell = (UITableViewCell *)view;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    if (!indexPath) {
        return; // The cell was not in the table view
    }

    NSInteger arrayIndex = indexPath.row;
    …
}

顺便说一下,您的代码有问题。当您将重复使用的单元格出列时,它上面已经有一个标签和一个按钮。

您的代码只会在现有按钮和标签之上保留分层标签和按钮。这会导致问题。

在 cellforrowatindexpath 中,

button.tag = indexpath.row
button.addTarget(self, action: Selector("FindTag:"), forControlEvents: UIControlEvents.TouchUpOutside)

并且在目标方法中

    @IBAction func FindTag(sender: UIButton) {
    let buttontag = sender.tag // it is the row where button is
    //Now you know which row contains the button.
}