2012-03-28 17 views
0

Ich habe einen tableviewController mit benutzerdefinierten Zellen, die ein Label und einen Switch enthalten. i speichern den Zustand der Schalter in CoredataUSSwitch in CoreData speichern

- (IBAction)roomSwitch:(id)sender { 

NSLog(@"Switch wurde betätigt"); 
NSManagedObjectContext *context = [app managedObjectContext]; 

UISwitch *switcher = sender; 
NSInteger rowInIndexPath = switcher.tag; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowInIndexPath inSection:0]; 
Raumattribute *att=[self.fetchedResultsController objectAtIndexPath:indexPath]; 

att.switch = [NSNumber numberWithBool:switcher.on]; 

NSError *error = nil; 
if (![context save:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
NSLog(@"Schalter: %@", att.switch); 

}

This Works ->

2012-03-28 16:43:34.657 Book-App[40011:11903] Switch: 1 
2012-03-28 16:43:37.373 Book-App[40011:11903] Switch wurde betätigt 
2012-03-28 16:43:37.377 Book-App[40011:11903] Switch: 0 

In meinem cellForRowAtIndexPath i [cell.raumSwitch addTarget:self action:@selector(roomSwitch:) forControlEvents:UIControlEventValueChanged];

wich ruft die roomSwitch haben:

Jetzt ist mein Problem, dass, wenn ich einen Schalter ändere, ein anderer Schalter seinen Zustand auch ändert. Wie kann ich dem Switch sagen, zu welcher Zeile er gehört?

Mein zweites Problem ist, wenn ich die Ansicht ändere, änderten alle Schalter auf aus. Wie kann ich den aktuellen Status anzeigen, der in CoreData gespeichert ist?

Ich versuchte

cell.roomSwitch = [managedObject valueForKey:@"switch"]; 

aber es stürzt ab.

Hoffe jemand meine Probleme zu verstehen.

Antwort

0

Was können Sie tun, ist ein Tag-Attribut für jeden Schalter hinzufügen, die der Reihe entspricht. Auf diese Weise wissen Sie genau, auf welchen Schalter/welche Zeile geklickt wurde. Um den Zustand des Schalters zu ändern, benötigen Sie cell.roomSwitch.isOn = YES oder cell.roomSwitch.isOn = NO.

EDIT: Wenn Sie BOOL-Wert verwenden, um es in Core Data zu speichern, ist der Typ NSNumber. So ändern Sie den Schalter, den Sie benötigen cell.roomSwitch.isOn = [managedObject.switch boolValue]

Sie können eine klare Idee über die Tags verwenden und zu wissen, den Schalter für die Zeile in diesem Beispiel für UIButton geändert wurde, die im Grunde das gleiche ist: Detecting which UIButton was pressed in UITableView

0

Ich denke, die einfachste Lösung wäre uitableviewcell als Prototyp zu untergliedern und in dieser Unterklasse das IBOutlet zu einem Schalter und auch einen Zeiger auf das managedobject speichern. Jedes Mal, wenn die Zelle konfiguriert wird, legen Sie das Objekt fest und wechseln Sie den Wert basierend auf diesem Objekt.

Jedes Mal, wenn ein Schaltereignis das Objekt bereits in der Zelle, die es in gefeuert haben gebrannt wird.

0

Ich denke, ich habe es zu arbeiten, dass er nur den Schalter abgegriffen ändern

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    RaumAttributeCell *cell =(RaumAttributeCell *)[tableView dequeueReusableCellWithIdentifier:@"attributCell"]; 


NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
cell.raumAttributLabel.text = [managedObject valueForKey:@"attributname"]; 



NamedUISwitch *mySwitch = [[NamedUISwitch alloc] initWithFrame:CGRectZero]; 
[mySwitch addTarget:self action:@selector(raumSwitch:) forControlEvents:UIControlEventTouchUpInside]; 


cell.accessoryView = mySwitch; 
[cell.contentView addSubview:mySwitch]; 



mySwitch = [cell.contentView.subviews objectAtIndex:0]; 
[mySwitch setTag:indexPath.row]; 

return cell; 

}

- (IBAction)raumSwitch:(id)sender { 

NSLog(@"Switch wurde betätigt"); 
NSManagedObjectContext *context = [app managedObjectContext]; 

UISwitch *switcher = sender; 
int row = switcher.tag; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
Raumattribute *att=[self.fetchedResultsController objectAtIndexPath:indexPath]; 

att.schalter = [NSNumber numberWithBool:switcher.on]; 

NSError *error = nil; 
if (![context save:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
NSLog(@"Schalter: %@", att.schalter); 

}

Aber ich weiß immer noch nicht, wie man den in coreData gespeicherten Zustand anzeigt.

Vielleicht können Sie mir einen Code zur Verfügung stellen, wie kann ich das tun?

Bevor ich den Schalter subclassed ich versuchte

Zelle.roomSwitch.isOn = [managedObject.switch boolValue]

aber es hat nicht funktioniert.

+0

Ich habe die Lösung selbst gefunden mySwitch.on = [[managedObject valueForKey: @ "schalter"] boolValue]; THX für Ihre Hilfe! – Bashud