Pregunta

Tengo una aplicación donde los usuarios lista pulsa el botón + y entran en un artículo que se desea que aparezca en la lista y pulsa guardar. La tabla se guarda con los datos básicos. El único problema es cuando la célula se graba Quiero una marca de verificación que se mostrará. He activado la selección múltiple con

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

Me gustaría las marcas de verificación que se persistieron en la célula después de las salidas de usuario. He creado un atributo en mi entidad llamada "cheques" y le dio el tipo de booleano pero no sé cómo hacerlo, donde si se golpea una fila a continuación, aparece un cheque y se conserva. Cualquier ayuda sería muy apreciada. Gracias

¿Fue útil?

Solución

Esto es cómo lo hago. Un punto notable: CoreData no almacena booleanos, por lo que cualquier propiedad denominada "booleano" es en realidad el tipo de NSNumber. Hay que recordar para convertir un lado a otro cuando se trata de CoreData y valores booleanos.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];


    if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
        [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
    } else {
        [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
    }
}

Tengo mi UITableViewController establece como el delegado para la NSFetchedResultsController, por lo que los cambios que hice a los objetos gestionados en la consulta ^^^ hará que los dos métodos siguientes para ejecutar.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *defaultCellIdentifier = @"Item";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
    }

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    cell.textLabel.text = [item valueForKey:@"name"];

    if ([[item valueForKey:@"checks"] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

Así es como todo lo que une

  1. El usuario hace clic en una fila
  2. tableView: didSelectRow ... método cambia la propiedad "isDone" del objeto gestionado adecuada
  3. .
  4. los resultados inverosímiles avisos de controlador que un objeto administrado ha cambiado y llama al método controllerDidChangeContent de su delegado.
  5. Mi método controllerDidChangeContent simplemente vuelve a cargar todos los datos en la vista de tabla
  6. Cuando se vuelve a cargar el tableView, mi tableView: cellForRow ... método comprueba la propiedad "isDone" del tema logrado ver si la célula debe tener una marca de verificación o no
  7. .

Y para que no se confunda, inicialmente utilice un NSMangagedObject genérico para almacenar la fila estado, por lo que el primer método que he publicado dice, [selectedObject valueForKey:@"isDone"]. Más tarde me cambié a un objeto administrado una subclase llamada JKItem, por lo que el segundo conjunto de métodos es capaz de utilizar item.isDone sin generar una advertencia del compilador.

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