Скрытие определенной строки UITableViewCell

#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. Спасибо, Ник! Теперь я понял идею.