Come può un segno di spunta stato salvato nel core di dati?
-
19-09-2019 - |
Domanda
Ho un elenco di app dove gli utenti di colpire il pulsante " + " e inserire un elemento che si desidera visualizzare nell'elenco e fare clic su salva.La tabella è salvato con i dati fondamentali.L'unico problema è che quando il cell è nastrate voglio un segno di spunta per essere visualizzato.Ho attivato la selezione multipla con
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
Io vorrei che i segni di spunta per essere mantenuta in cella dopo l'uscita dell'utente.Ho creato un attributo dell'entità denominata "controlli" e gli ha dato il tipo boolean, ma non so come fare, dove se si ha colpito una riga, quindi visualizzato un segno di spunta e persistente.Qualsiasi aiuto sarebbe molto apprezzato.Grazie
Soluzione
Questo è come lo faccio.Un punto importante:CoreData non memorizza i valori booleani, in modo che qualsiasi proprietà etichetta "boolean" in realtà è di tipo NSNumber
.Hai avuto modo di ricordarsi di convertire avanti e indietro quando si tratta con CoreData e valori booleani.
- (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"];
}
}
Io ho il mio UITableViewController
impostato come delegato per la NSFetchedResultsController
, in modo che le modifiche che ho fatto di oggetti gestiti nella query ^^^ causa due metodi seguenti per essere eseguito.
- (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;
}
Ecco come tutto ciò che lega insieme
- Utente fa clic su una riga
- tableView:didSelectRow...metodo cambia il "isDone", di proprietà dell'appropriato oggetto gestito.
- recuperati i risultati controllore si accorge che un oggetto gestito ha cambiato e chiama il
controllerDidChangeContent
metodo sul suo delegato. - Il mio
controllerDidChangeContent
metodo di ricarica tutti i dati in tabella - Quando la tableView viene ricaricato, il mio tableView:cellForRow...metodo di verifica la "isDone" di proprietà dell'elemento gestito per vedere se il cell dovrebbe avere un segno di spunta o non.
E per non confondersi, inizialmente ho usato un generico NSMangagedObject
per memorizzare la riga di stato, che è il motivo per cui il primo metodo che ho postato dice, [selectedObject valueForKey:@"isDone"]
.Poi sono passato a una classe gestita oggetto denominato JKItem
, che è il motivo per cui la seconda serie di metodi che è possibile utilizzare item.isDone
senza la generazione di un avviso del compilatore.