Сохранение USSwitch в CoreData - PullRequest
0 голосов
/ 28 марта 2012

у меня есть один tableviewController с пользовательскими ячейками, который содержит метку и переключатель. я сохраняю состояние коммутатора в 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);

}

Это работает ->

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

В моем cellForRowAtIndexPath у меня есть [cell.raumSwitch addTarget:self action:@selector(roomSwitch:) forControlEvents:UIControlEventValueChanged];

который вызывает номер переключателя:

Теперь моя проблема в том, что если я поменяю переключатель, другой переключатель также изменит его состояние. Как я могу сказать переключателю, к какой строке он принадлежит.

Моя вторая проблема: если я меняю вид, все переключатели выключаются. Как я могу показать фактическое состояние, которое сохраняется в CoreData?

Я пытался

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

но он вылетает.

Надеюсь, кто-то понимает мои проблемы.

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Что вы можете сделать, это добавить атрибут Tag для каждого переключателя, который соответствует строке. Таким образом, вы будете точно знать, какой переключатель / какую строку щелкнули. Для изменения состояния коммутатора вам нужно cell.roomSwitch.isOn = YES или cell.roomSwitch.isOn = NO.

РЕДАКТИРОВАТЬ: Если вы используете значение BOOL для хранения его в базовых данных, то тип NSNumber. Для смены переключателя вам нужно cell.roomSwitch.isOn = [managedObject.switch boolValue]

Вы можете получить более четкое представление об использовании тегов и знании переключателя, для которого строка была изменена в этом примере для UIButton, которая в основном такая же: Определение, какая кнопка UIB была нажата в UITableView

0 голосов
/ 29 марта 2012

Я думаю, я получил его на работу, что он только поменял повернутый переключатель

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

}

Но я до сих пор не знаю, как показать состояние, сохраненное в coreData.

Может быть, вы можете дать мне код, как я могу это сделать?

До того, как я переключил подкласс, я попробовал

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

но это не сработало.

0 голосов
/ 28 марта 2012

Я думаю, что самым простым решением было бы создать подкласс uitableviewcell в качестве прототипа и в этом подклассе иметь IBOutlet для коммутатора и также хранить указатель на управляемый объект. Каждый раз, когда ячейка конфигурируется, задайте объект и значение переключателя на основе этого объекта.

Каждый раз, когда срабатывает событие switch, у вас уже есть объект внутри ячейки, в которой он запущен.

...