2010-11-20 13 views
0

Ich habe eine Core Data-Anwendung eingerichtet mit einem ListViewController, einem DetailViewController und einem EditingViewController, wo die meisten der Bearbeitung stattfindet. Auf der ListViewController habe ich eine Grafik einer Checkbox, und ich kann zwei Bilder umschalten, indem Sie die Zeile inKönnen Sie Core-Daten auf ListViewController bearbeiten

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

Auswahl ist es möglich, den Core Data Datensatz aus den ListViewController zu bearbeiten, so dass ich meine Auswahl persistent machen kann ? Ich kann die Syntax nicht ausarbeiten, um den Datensatz auszuwählen, zu bearbeiten und den Wert zu speichern - was einfach von "wahr" zu "falsch" wechselt.

jon

Danke für die schnelle Antwort! Zusatzinformation nach Antwort 1. Ihre Annahme ist richtig. Ich modelliere diese Anwendung im CoreData Books-Beispiel. Ich verwende keine Schaltfläche, sondern verwende zwei Bilder, um ein Kontrollkästchen zu aktivieren und zu deaktivieren. Ich fügte meiner Entität einen booleschen "Check" hinzu, erstellte die Header-Datei neu und fügte die Header-Datei zu meinem ListViewController hinzu. Hier ist eine vereinfachte Version der Datamodel-Header-Datei.

@interface Patient : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSNumber * check; 
@property (nonatomic, retain) NSString * lastName; 

@end 

Und hier ist meine Modifikation des Codes:

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

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    if (![entityObject.check boolValue]) { 
     entityObject.check = [NSNumber numberWithBool:YES]; 
     cell.imageView.image = [UIImage imageNamed:@"check.png"]; 
     } 
    else { 
     entityObject.check= [NSNumber numberWithBool:NO]; 
     cell.imageView.image = [UIImage imageNamed:@"uncheck.png"]; 
    } 

aber das gibt mir den Fehler „Antrag auf Mitglieder überprüfen 'in etwas keine Struktur oder Union“. Ich habe überprüft, dass das neue Attribut ein boolescher Wert ist und dass die Headerdatei in den ListViewController importiert wird. Irgendwelche Gedanken?

Schließlich beseitigt dieser Code die Notwendigkeit, entityObject.check in der Datenbank zu speichern? Danke noch einmal.

+0

Weil Sie keine benutzerdefinierten haben Sie Klassen besitzen Objektmodell erklärt, Sie können ihre Werte mit dem folgenden jeweils erhalten und eingestellt: setzen Verwendung [EntityObject setValue: [NSNumber numberWithBool: JA] forKey: @ „check“ ] und um [entityValue valueForKey: @ "check"] – Rog

+0

Sorry, wo es EntityValue in der letzten Zeile liest sollte EntityObject sein, falls Sie das nicht herausgefunden haben. – Rog

+0

Sie möchten vorsichtig mit Kontrollkästchen-Tasten auf dem iPhone. Benutzer tendieren dazu, Fehler doppelt zu tippen. Deshalb wurde das Schiebeschalter-Steuerelement erstellt, damit Benutzer schnell und einfach binäre Zustände einstellen können. – TechZen

Antwort

1

Es wäre schön, ein paar weitere Details über Ihre App zu erhalten, bevor wir eine fundiertere Empfehlung abgeben können. Ich werde ein paar Annahmen machen, um zu sehen, ob es hilft ...

Erstens, wenn es um BOOL-Eigenschaften in Coredata geht, ist es wichtig, daran zu denken, dass sie tatsächlich als NSNumbers gespeichert sind, also denken Sie daran, wenn Sie brauchen um ihre Werte zu testen und sicherzustellen, dass Sie die richtigen Methoden verwenden.

die Daten in Ihrem ListViewController Angenommen wird von Coredata bevölkert und Ihr Datenmodell definiert eine Einheit „Entity“ mit einem Attribut vom Typ BOOL „Favoriten“ genannt, ist hier, was Sie versuchen können:

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

     NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
     if (![entityObject.favourite boolValue]) { 
      entityObject.favourite = [NSNumber numberWithBool:YES]; 
      [self.yourToggleButton setSelected:YES]; // this assumes your checkbox is a UIButton and you want its view to be updated to checked when your BOOL == YES 
     } 
     else { 
      entityObject.favourite = [NSNumber numberWithBool:NO]; 
      [self.watchListButton setSelected:NO]; 
     } 

Die Obiges geht davon aus, dass Sie einen hostedResultsController haben, der sich um das Abrufen von Daten aus Ihrer CoreData-Datenbank kümmert. Wenn nicht, empfehle ich Ihnen dringend, eine der Tutorials von Apple (CoreData Books und CoreData Recipes) zu lesen, um zu verstehen, wie sie funktionieren, da es Ihr Leben viel einfacher macht - NSFetchedResultsController macht es ziemlich einfach, Ihre Daten zwischen verschiedenen Ansichten synchronisiert zu halten etwas, das Sie besonders berücksichtigen müssen, weil Sie zulassen, dass verschiedene Attribute in verschiedenen View-Controllern bearbeitet werden.

Ich hoffe, dass dies hilft, aber fühlen Sie sich frei, irgendwelche zusätzlichen Fragen zu stellen, wenn Sie müssen. Prost, Rog

+1

Siehe Anhang zu meiner Frage oben. Jon – jon

+0

Da Sie benutzerdefinierte Objektmodellklassen nicht benutzerdefiniert deklariert haben, können Sie ihre Werte mit den folgenden Werten abrufen bzw. festlegen: um [entityObject setValue: [NSNumber numberWithBool: YES] forKey: @ "check"] zu setzen und zu erhalten [entityObject valueForKey: @ "check"] – Rog

+0

Siehe meine Lösung unten. – jon

0

Ich kam mit einer etwas anderen Lösung, aber Rog's Post hat mich definitiv auf die richtige Spur gebracht. Ich hatte einige Probleme mit der booleschen Syntax, also änderte ich das Entitätsattribut in eine Zeichenkette und benutzte stattdessen "N" und "Y". Ich fand auch, dass ich den Wert speichern musste, um es dauerhaft zu machen. Ich schätze die Hilfe.

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

    // Establish connections 
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    Patient *patient = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Toggle images and check value with each row tap 
    if ([patient.check isEqualToString: @"N"] == YES) { 
     cell.imageView.image = [UIImage imageNamed:@"check.png"]; 
     patient.check = @"Y"; 
    } 
    else { 
     cell.imageView.image = [UIImage imageNamed:@"uncheck.png"]; 
     patient.check = @"N"; 
    } 

    // Save check value 
    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 
Verwandte Themen