title: Detecting which UIButton was pressed in a UITableView
body: <p>I have a <code>UITableView</code> with 5 <code>UITableViewCells</code>. Each cell contains a <code>UIButton</code> which is set up as follows:</p>
  
  <pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
       NSString *identifier = @"identifier";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
       if (cell == nil) {
           cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
           [cell autorelelase];
  
           UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
           [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
           [button setTag:1];
           [cell.contentView addSubview:button];
  
           [button release];
       }
  
       UIButton *button = (UIButton *)[cell viewWithTag:1];
       [button setTitle:@"Edit" forState:UIControlStateNormal];
  
       return cell;
  }
  </code></pre>
  
  <p>My question is this: in the <code>buttonPressedAction:</code> method, how do I know which button has been pressed. I've considered using tags but I'm not sure this is the best route. I'd like to be able to somehow tag the <code>indexPath</code> onto the control.</p>
  
  <pre><code>- (void)buttonPressedAction:(id)sender
  {
      UIButton *button = (UIButton *)sender;
      // how do I know which button sent this message?
      // processing button press for this row requires an indexPath. 
  }
  </code></pre>
  
  <p>What's the standard way of doing this?</p>
  
  <p><strong>Edit:</strong></p>
  
  <p>I've kinda solved it by doing the following. I would still like to have an opinion whether this is the standard way of doing it or is there a better way?</p>
  
  <pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
       NSString *identifier = @"identifier";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
       if (cell == nil) {
           cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
           [cell autorelelase];
  
           UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
           [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
           [cell.contentView addSubview:button];
  
           [button release];
       }
  
       UIButton *button = (UIButton *)[cell.contentView.subviews objectAtIndex:0];
       [button setTag:indexPath.row];
       [button setTitle:@"Edit" forState:UIControlStateNormal];
  
       return cell;
  }
  
  - (void)buttonPressedAction:(id)sender
  {
      UIButton *button = (UIButton *)sender;
      int row = button.tag;
  }
  </code></pre>
  
  <p>What's important to note is that I can't set the tag in the creation of the cell since the cell might be dequeued instead. It feels very dirty. There must be a better way.</p>