2012-03-28 5 views
0

J'ai un tableviewController avec des cellules personnalisées qui contiennent une étiquette et un commutateur. i enregistrer l'état du commutateur dans CoreDataEnregistrement USSwitch à CoreData

- (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 

Dans mon cellForRowAtIndexPath j'ai [cell.raumSwitch addTarget:self action:@selector(roomSwitch:) forControlEvents:UIControlEventValueChanged];

Wich appelle le roomSwitch:

Maintenant, mon problème est que si je change un commutateur, un autre commutateur va également changer son état. Comment puis-je dire au Switch à quel rang il appartient.

Mon deuxième problème est que si je change d'affichage, tous les commutateurs sont désactivés. Comment puis-je montrer l'état actuel qui est enregistré dans CoreData?

J'ai essayé

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

mais il se bloque.

J'espère que quelqu'un comprendra mes problèmes.

Répondre

0

Ce que vous pouvez faire est d'ajouter un attribut de balise pour chaque commutateur qui correspond à la ligne. De cette façon, vous saurez exactement quel commutateur/sur quelle ligne a été cliqué. Pour changer l'état du commutateur, vous avez besoin de cell.roomSwitch.isOn = YES ou cell.roomSwitch.isOn = NO.

EDIT: Si vous utilisez la valeur BOOL pour le stocker dans les données de base, le type est NSNumber. Pour changer le commutateur dont vous avez besoin cell.roomSwitch.isOn = [managedObject.switch boolValue]

Vous pouvez obtenir une idée plus claire sur l'utilisation des balises et connaître le commutateur pour lequel la ligne a été modifiée dans cet exemple pour UIButton qui est fondamentalement la même: Detecting which UIButton was pressed in UITableView

0

Je pense que la solution la plus simple serait de sous-classer uitableviewcell en tant que prototype et dans cette sous-classe avoir l'IBOutlet à un commutateur et également stocker un pointeur sur l'managedobject. Chaque fois que la cellule est configurée, définissez l'objet et changez la valeur en fonction de cet objet.

Chaque fois qu'un événement de commutation vous est tiré avez l'objet déjà à l'intérieur de la cellule qu'il a tiré dans.

0

Je pense je l'ai eu à travailler, qu'il change que le commutateur exploité

- (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); 

}

Mais je ne sais toujours pas comment afficher l'état qui est sauvegardé dans les données de base.

Peut-être que vous pouvez me fournir un code comment je peux le faire?

Avant i i le commutateur sous-classé essayé

cellule

.roomSwitch.isOn = [managedObject.switch boolValue]

mais cela n'a pas fonctionné.

+0

J'ai trouvé la solution par moi même mySwitch.on = [[managedObject valueForKey: @ "schalter"] boolValue]; THX pour votre aide! – Bashud