Как можно сохранить состояние галочки в основных данных?
-
19-09-2019 - |
Вопрос
У меня есть приложение списка, в котором пользователи нажимают кнопку +, вводят элемент, который они хотят отображать в списке, и нажимают «Сохранить».Таблица сохраняется с основными данными.Единственная проблема заключается в том, что когда ячейка записана на пленку, я хочу, чтобы отображалась галочка.Я включил множественный выбор с помощью
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
Я хотел бы, чтобы галочки сохранялись в ячейке после выхода пользователя.Я создал атрибут в своей сущности под названием «проверки» и присвоил ему тип логического значения, но я не знаю, как сделать так, чтобы при нажатии на строку появлялась и сохранялась проверка.Любая помощь будет принята с благодарностью.Спасибо
Решение
Вот как я это делаю.Один примечательный момент:CoreData не хранит логические значения, поэтому любое свойство, помеченное как «логическое», на самом деле имеет тип NSNumber
.Вы должны помнить о преобразовании туда и обратно при работе с CoreData и логическими значениями.
- (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"];
}
}
У меня есть мой UITableViewController
установить в качестве делегата для NSFetchedResultsController
, поэтому изменения, которые я внес в управляемые объекты в запросе ^^^, приведут к запуску следующих двух методов.
- (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;
}
Вот как все взаимосвязано
- Пользователь нажимает на строку
- tableView:didSelectRow...Метод изменяет свойство isDone соответствующего управляемого объекта.
- Контроллер извлеченных результатов замечает, что управляемый объект изменился, и вызывает
controllerDidChangeContent
метод для своего делегата. - Мой
controllerDidChangeContent
метод просто перезагружает все данные в виде таблицы - Когда tableView перезагружается, мой tableView:cellForRow...Метод проверяет свойство isDone управляемого элемента, чтобы определить, должна ли ячейка быть отмечена галочкой или нет.
И чтобы вы не запутались, я изначально использовал общий NSMangagedObject
для хранения состояния строки, поэтому первый опубликованный мной метод говорит: [selectedObject valueForKey:@"isDone"]
.Позже я переключился на подкласс управляемого объекта с именем JKItem
, поэтому второй набор методов может использовать item.isDone
без генерации предупреждения компилятора.