Pregunta

Tengo un TableView que contiene una lista de nombres de usuario que están indexados en secciones y filas alfabéticamente. Cuando toco una de las filas en una sección, se agrega el usuario correcto a mi matriz de destinatarios y una marca de verificación se encuentra en la celda además de su nombre ... pero también se muestra una marca de verificación junto a otros nombres de usuario que no se han seleccionado y no están en la matriz de destinatarios. He intentado reasignar la celda seleccionada con un nuevo IndexPath (ver código a continuación) pero no he podido hacer que funcione. Registra la ruta correcta, pero no la asignará. Estoy usando un método similar para asignar a los usuarios las filas en cada sección sin problemas, pero por alguna razón las marcas de accesorios me están dando problemas. He visto otros hilos sobre el desbordamiento sobre este mismo tema, pero lavarlo; 'puede llegar a una solución para mi caso. ¿alguna pista? ¡salud!

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

    int row = indexPath.row;
    int section = indexPath.section;
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:row inSection:section];

    [tableView deselectRowAtIndexPath:newIndexPath animated:NO];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:newIndexPath];

    NSArray *array = [self.sectionsArray objectAtIndex:indexPath.section];
    PFUser *user = [array objectAtIndex:indexPath.row];

    if (cell.accessoryType == UITableViewCellAccessoryNone) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [self.recipients addObject:user];
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [self.recipients removeObject:user];
    }

    [self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (error) {
            NSLog(@"Error %@ %@", error, [error userInfo]);
        }
    }];

Y aquí está el CellforrowatIndExpath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Get the user names from the array associated with the section index in the sections array.
    NSArray *userNamesInSection = (self.sectionsArray)[indexPath.section];

    // Configure the cell with user name.
    UserNameWrapper *userName = userNamesInSection[indexPath.row];
    cell.textLabel.text = userName.user;

    return cell;
}
¿Fue útil?

Solución

Como veo, cometió 2 errores en CellforrowatIndExpath que no verificaron si la celda es nula para crear uno y establecer AccessoryType para Cell de acuerdo con la lista de destinatarios.

Deberías hacer a continuación:

NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

PFUser *user = [self getUserAtIndexPath:indexPath];
cell.textLabel.text = user.name;

if ([self.recipients containObject:user]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

return cell;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top