Lo que llama a setSelected: NO método automáticamente

Tengo este extraño problema con UITableView y UITableViewCell. Siempre que the -tableView:cellForRowAtIndexPath: se llame setSelected: NO se invoca después.

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *cellData = dataSource[indexPath.row]; NSString *cellId = nil; //choose cell type NSInteger type = [[cellData valueForKey:@"type"] integerValue]; switch (type) { case 0: //root level cellId = @"rootHeaderCell"; break; case 1: //sub header cellId = @"subHeaderCell"; break; case 2: default: //value row - radiobutton cellId = @"radiobuttonCell"; break; } CSBaseFilterCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath]; // Configure the cell... [cell setData:cellData]; return cell; } 

cellData contiene información sobre la selección y en la celda:

 -(void)setData:(NSDictionary *)data { NSLog(@"Set Data"); NSLog(@"data has selected=%d", [data hasKey:@"selected"]); NSLog(@"data.selected=%@", [data valueForKey:@"selected"]); if ([data hasKey:@"selected"]) { [self setSelected:[[data valueForKey:@"selected"] boolValue] animated:NO]; } } 

Configuré la selección, pero no fue seleccionada. Puse rastros en setData y los valores estaban bien, puse trace en setSelected:animated: y encontré que se realizan 3 llamadas:

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; NSLog(@"%@ setSelected:selected=%d",self,selected); self.accessoryType = selected ? UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone; } 

esto es lo que se muestra en la salida de logging:

 2014-06-05 21:11:59.679 UITableView Filter Sort[42821:60b] Set Data 2014-06-05 21:11:59.679 UITableView Filter Sort[42821:60b] data has selected=1 2014-06-05 21:11:59.680 UITableView Filter Sort[42821:60b] data.selected=1 2014-06-05 21:11:59.680 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=1 2014-06-05 21:11:59.686 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=0 2014-06-05 21:11:59.811 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=0 

La tabla se coloca en ViewController , no es UITableViewController.

ACTUALIZACIÓN He puesto setData: call en willDisplayCell:forRowAtIndexPath: y eliminó la llamada a la super definición de setSelected y esto resolvió el problema. Todavía muestra en los loggings que setSelected se invoca sin argumento entre setData en cellForRowAtIndexPath y willDisplayCell:forRowAtIndexPath: pero al less WillDisplay es el último 🙂

También he intentado con éxito con mi propia propiedad de "selección" checked que se establece en setData: y en didSelectRowAtIndexPath:

Hacer setSelected en - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath