Cómo establecer la acción para el button UIB en UITableViewCell

Tengo el file XIB TimerCell.xib con UITableViewCell . En otra class en cellForRowAtIndexPath , inicializo este UITableViewCell :

  static NSString *CellIdentifier = @"cellTimer"; TimerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { //cell = [[TimerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TimerCell"owner:self options:nil]; cell = [nib objectAtIndex:0]; 

En mi TimerCell tengo dos UILabel y un UIButton . Para este button me gustaría establecer la acción en algún método.

¿Cómo puedo hacer eso? ¿Y cómo mostrar en el primer UILabel los datos de mi timer de count regresiva de background en time real?

Esta pieza de código te ayudará

 static NSString *CellIdentifier = @"cellTimer"; TimerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { //cell = [[TimerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TimerCell"owner:self options:nil]; cell = [nib objectAtIndex:0]; UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect]; button.tag=indexPath.row; [button addTarget:self action:@selector(aMethod:) forControlEvents:UIControlEventTouchDown]; [button setTitle:@"cellButton" forState:UIControlStateNormal]; button.frame = CGRectMake(80.0, 0.0, 160.0, 40.0); [cell.contentView addSubview:button]; } return cell; } -(void)aMethod:(UIButton*)sender { NSLog(@"I Clicked a button %d",sender.tag); } 

¡¡¡Espero que esto ayude!!!

Como tiene una subclass de UITableViewCell llamada TimerCell , puede agregar properties de salida a TimerCell . Por ejemplo:

 @interface TimerCell : UITableViewCell @property (nonatomic, strong) UIButton *button; @property (nonatomic, strong) UILabel *label; @end 

En TimerCell.xib , conecte los sockets al button y a la label.

Luego, en tableView:cellForRowAtIndexPath: puede acceder fácilmente al button para establecer su objective y acción:

 static NSString *CellIdentifier = @"cellTimer"; TimerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TimerCell"owner:self options:nil]; cell = [nib objectAtIndex:0]; } [cell.button addTarget:self action:@selector(cellButtonWasTapped:) forControlEvents:UIControlEventTouchUpInside];; 

Puede acceder a la label de la celda utilizando su propiedad de label para actualizarla cuando el timer dispare.

Otra forma de get el button y la label es usar tags de vista, como describí en esta respuesta .

En cellButtonWasTapped: (o cualquier acción que envíe desde el button), probablemente querrá search la ruta de índice de la celda que contiene el button. Explico cómo hacerlo en esta respuesta .

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"cellTimer"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; NSInteger index = indexPath.row; UILabel *titleLabel = (UILabel *)[cell viewWithTag:101]; UIButton *button = (UIButton *)[cell viewWithTag:100]; [button addTarget:self action:@selector(MethodName:) forControlEvents:UIControlEventTouchUpInside]; } 

Y establezca la label UIButton y UILabel en su file XIB TimerCell.xib

Haga una mejor investigación antes de publicar en SO. Aquí está el código para agregar el button a la celda

 UIButton *Button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [Button addTarget:self action:@selector(MethodName:) forControlEvents:UIControlEventTouchUpInside]; [Button setTitle:@"ButtonTitle" forState:UIControlStateNormal]; Button.frame = CGRectMake(100.0, 10.0, 40.0, 40.0); [cell.contentView addSubview:Button];