#iphone #objective-c #cocoa-touch #core-data
#iPhone #objective-c #cocoa-touch #core-данные
Вопрос:
Я работаю над приложением списка задач с CoreData UITableView, я хотел бы скрыть строку, которую пользователь помечает как выполненную.
Мое текущее решение заключается в вызове deleteRowsAtIndexPaths, когда пользователь отмечает выполненную задачу и вычитает удаленную строку из функции numberOfRowsInSection.
-(void)markDone:(NSIndexPath *) _indexPath{
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:_indexPath] withRowAnimation:UITableViewRowAnimationFade];
deletedCount = deletedCount 1;
[self.tableView endUpdates];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
if (deletedCount>0) {
return [sectionInfo numberOfObjects]-deletedCount;
}
return [sectionInfo numberOfObjects];
}
Хотя этот метод действительно работает, но мне нужно немного взломать код здесь и там. Есть ли способ вызвать NSFetchedResultsController didChangeObject для изменения статуса определенного поля?
Спасибо
Комментарии:
1. мне кажется правильным, рассматривали ли вы возможность использования двух списков для ваших данных, одного для всех и одного для тех, которые не были помечены как выполненные?
2. Предпочел бы единый список. Я тоже не слишком уверен, как создать два списка с основными данными. лол.
Ответ №1:
Я думаю, что есть много способов решить эту проблему. Я бы просто добавил поле в ваш управляемый объект, в котором указано, скрыта строка или нет»
Удаление установит это поле соответствующим образом.
Что вам нужно сейчас, так это NSFetchRequest с соответствующим предикатом для фильтрации скрытых строк.
Я только что создал простое приложение-шаблон с поддержкой core data, и я думаю, что этого очень легко достичь:
Я добавил скрытое свойство BOOL к одному указанному объекту с номером по умолчанию.
Затем я добавил этот код в didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"hidden"];
}
В - (NSFetchedResultsController *)fetchedResultsController {...
я добавил
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hidden == NO"];
[fetchRequest setPredicate:predicate];
после
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
Это было сделано для того, чтобы скрыть ячейки, щелкнув (только для этого примера) по ним.
Комментарии:
1. Спасибо за ответ. Я могу запросить данные еще раз, но мне бы хотелось показать эффект затухания строки. Вот почему я прикидываю, как бы мне вызвать NSFetchResultController didChangeObject с действием NSFetchedResultsChangeDelete. Есть ли у нас способ вызвать функцию didChangeObject, изменив поле строки (например, установив done = 1)?
2. Обновил мой ответ, надеюсь, это поможет.
3. Спасибо, Ник! Теперь я понял идею.