2012-08-30 18 views
8

Tengo un UITableview que estoy mostrando algunas tareas y cada fila tiene una casilla de verificación para marcar tareas completadas o no.Seleccionando UITableViewCell AccessoryView, separado de la fila de selección

Estoy tratando de alternar la marca de verificación cuando el usuario toca en la casilla de verificación, y cambiar a una vista detallada cuando el usuario toca en la fila. Este último es fácil, sólo mediante el uso

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Sin embargo, quería separar las áreas de selección, activando únicamente la casilla de verificación cuando se selecciona la accessoryview, y yendo a la vista detalla sólo cuando se selecciona el resto de la célula. Si agrego un UIbutton dentro de accessoryview, el usuario estaría seleccionando la fila Y el UIButton cuando solo deseaban marcar la casilla de verificación, ¿verdad?

Además, ¿qué sucede si el usuario solo estaba desplazándose por la tabla arrastrando a lo largo del accessoryview? ¿Esto no desencadenaría una acción en el UIButton en TouchUp?

¿Alguien tiene alguna idea sobre cómo hacer esto? ¡Gracias por tu tiempo!

Respuesta

16

¿Qué hay de la gestión de los grifos de accesorios dentro de este método delegado:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 

EDIT:

Usted puede hacer algo como esto para accessoryView personalizado que responde a accessoryButtonTappedForRowWithIndexPath: método.

En cellForRowAtIndexPath: Método -

BOOL checked = [[item objectForKey:@"checked"] boolValue]; 
UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"]; 

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
button.frame = frame; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
button.backgroundColor = [UIColor clearColor]; 
cell.accessoryView = button; 

- (void)checkButtonTapped:(id)sender event:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil) 
    { 
    [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableDictionary *item = [dataArray objectAtIndex:indexPath.row]; 
    BOOL checked = [[item objectForKey:@"checked"] boolValue]; 
    [item setObject:[NSNumber numberWithBool:!checked] forKey:@"checked"]; 

    UITableViewCell *cell = [item objectForKey:@"cell"]; 
    UIButton *button = (UIButton *)cell.accessoryView; 

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"unchecked.png"] : [UIImage imageNamed:@"checked.png"]; 
    [button setBackgroundImage:newImage forState:UIControlStateNormal]; 
} 
+1

¿Cómo se obtiene el accesorio botón personalizado para volver a llamar al delegado de la vista de tabla? –

+0

Guau, no sé cómo me lo perdí, disculpe la pregunta tonta y gracias por la ayuda. Voy a dar una oportunidad, parece que eso es lo que estaba buscando. – Cody

+1

@CarlVeazey Buen punto, la documentación dice que accessoryButtonTappedForRowWithIndexPath responde al tipo de accesorio del botón de divulgación, que no es el tipo que quiero usar dado que quiero una casilla de verificación. Puedo evitar esto utilizando el botón de divulgación para la vista detallada, y tocando el resto de la fila para alternar una marca de verificación en otra parte de la fila, pero eso no es lo que quería. – Cody

Cuestiones relacionadas