Вот как я это делаю. Один заметный момент: 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
без генерации предупреждения компилятора.