Wie kann ein Häkchen Zustand in Kerndaten gespeichert werden?
-
19-09-2019 - |
Frage
Ich habe eine Liste app, wo Benutzer die + Taste getroffen und in einem Element eingeben, dass sie in der Liste angezeigt werden soll, und drücken Sie speichern. Der Tisch ist mit Kerndaten gespeichert. Das einzige Problem ist, wenn die Zelle geklebt ich ein Häkchen angezeigt werden soll. Ive aktiviert Mehrfachauswahl mit
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
Ich mag die Häkchen in der Zelle nach dem User-Exits beibehalten werden. Ich habe ein Attribut in meiner Einheit namens „Kontrollen“ erstellt und gab ihm die Art der boolean, aber ich weiß nicht, wie es zu machen, wo, wenn Sie eine Reihe treffen dann ein Häkchen angezeigt und beibehalten wird. Jede Hilfe wäre sehr geschätzt. Dank
Lösung
Dies ist, wie ich es tun. Ein bemerkenswerter Punkt: Coredata nicht booleans speichern, so dass jede Eigenschaft der Bezeichnung „boolean“ ist eigentlich vom Typ NSNumber
. Du musst daran zu erinnern, hin und her zu konvertieren, wenn sie mit Coredata und Boolesche Werte handelt.
- (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"];
}
}
Ich habe meine UITableViewController
für die NSFetchedResultsController
als die Delegierten festgelegt, so dass die Änderungen, die mich auf die verwalteten Objekte in der Abfrage gemacht ^^^ bewirkt, dass die folgenden zwei Verfahren ausgeführt werden.
- (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;
}
Hier ist, wie alles miteinander verbindet
- Der Nutzer klickt auf eine Zeile
- Tableview: didSelectRow ... Methode ändert die „IstFertig“ Eigenschaft des entsprechenden verwalteten Objekt .
- die abgerufenen Ergebnisse Controller bemerkt, dass ein verwaltetes Objekt geändert hat, und fordert die
controllerDidChangeContent
Methode auf seinem Delegierten. - My
controllerDidChangeContent
Methode nur neu lädt alle Daten in der Tabellenansicht - Wenn die Tableview neu geladen wird, meine Tableview: cellForRow ... Methode überprüft die „IstFertig“ Eigenschaft des verwalteten Artikel zu sehen, ob die Zelle ein Häkchen haben sollte oder nicht .
Und damit Sie nicht verwirrt bekommen, habe ich zunächst ein allgemeine NSMangagedObject
Zustand speichern Zeile, weshalb die erste Methode, die ich so geschrieben, [selectedObject valueForKey:@"isDone"]
. Später wechselte ich zu einem subclassed verwaltete Objekt namens JKItem
, weshalb der zweite Satz von Methoden in der Lage ist item.isDone
zu verwenden, ohne eine Compiler-Warnung erzeugt wird.