¿Cómo puede un estado de marca de verificación se guarda en los datos básicos?
-
19-09-2019 - |
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
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
- El usuario hace clic en una fila
- tableView: didSelectRow ... método cambia la propiedad "isDone" del objeto gestionado adecuada .
- los resultados inverosímiles avisos de controlador que un objeto administrado ha cambiado y llama al método
controllerDidChangeContent
de su delegado. - Mi método
controllerDidChangeContent
simplemente vuelve a cargar todos los datos en la vista de tabla - 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 .
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.