То, что я пытаюсь достичь, - это перезагрузка UITableView быстро. Каждая ячейка имеет «проверку» UIButton, которая сообщает пользователю, что элемент для этой ячейки выбран. Все выделенные ячейки должны быть в конце списка (нижние ячейки).Перезагрузка UITableView без анимации
Я использую NSFetchResultsController как делегат и источник данных для UITableView. NSFetchResultsController устанавливается для работы с «Пунктом» лицами с sectionKey выбранных для «галочки» имущества (часть од «Элемент» лицо, которое)
- (id)initWithItemView:(ItemView*)iv{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[CoreDataHandler context]];
[request setEntity:entity];
NSArray *predicates = [NSArray arrayWithObjects:[iv listDBUsingContext:[CoreDataHandler context]],nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lista IN %@ AND deletedDB == NO", predicates];
[request setPredicate:predicate];
[request setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"checked" ascending:YES selector:@selector(compare:)];
NSSortDescriptor *sortDescriptor2
= [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES selector:@selector(compare:)];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, sortDescriptor2, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
[sortDescriptor2 release];
if (self=[[FastTableDelegate alloc]
initWithFetchRequest:request
managedObjectContext:[CoreDataHandler context]
sectionNameKeyPath:@"checked"
cacheName:nil])
{
self.delegate = self;
self.itemView = iv;
self.heightsCache = [NSMutableDictionary dictionary];
}
[request release];
[self performFetch:nil];
return self;
}
Затем, когда пользователь кран UIButton в камере я изменить «проверил» свойство в NSmanagedObject (объект объекта) и сохранить контекст. Тогда мой NSFetchReslutsController уведомляется, что один элемент изменил его состояние и выполняет UITableView перезагружать с помощью функции
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.itemView.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeUpdate:
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
}
}
Потому что я изменил «проверил» имущество, которое sectionKey для моего NSFetchedResultsController UITableView должен быть перезагружен с этим сценарием
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
И вот проблема, потому что когда ячейки вставляются или делятся, UITableView выполняет анимацию, продолжительность которой составляет около 0,5 с. В это время UITableView перестает получать события для следующей ячейки, поэтому, когда пользователь «проверяет» другую ячейку, он не будет уведомлен об этом постукивании. То, что я пытаюсь достичь, - дать пользователю возможность быстро проверять некоторые ячейки, не дожидаясь окончания анимации.
Возможные решения:
Использование reloadData istead из deleteRowsAtIndexPaths/insertRowsAtIndexPaths. Это будет не анимация, а перезагрузка всего UITableView дольше, чем перезагрузка одной ячейки, поэтому в моем случае пользователь будет ждать перезагрузки UITableView - снова ждет. Есть ли способ избежать анимации без перезагрузки всего UITableView?
Позволяет пользователю проверять ячейки, но сохранять контекст только после 0,5 с после последнего выбора ячейки. Пользователь может выбрать быструю множественную ячейку, и когда он заканчивает выбор, все изменения распространяются на UITableView - мой босс хочет отправить каждую выбранную ячейку во вторую секцию без группировки, тогда одна перезагрузка для каждой выбранной ячейки - снова плохая идея
Возможно, некоторые Пользовательский tableView (пользователь создал, а не яблоко)?
Основная задача:
Разрешить «проверить» клетки быстро освежает UITableView после каждого «проверки»
Я открыт для любых идеалов :)
Я думаю, мы неправильно понимаем друг друга. viewDidAppear: запускается, когда представление представляется пользователю, но когда пользователь «проверяет» ячейки, я не представляю никакого нового представления, вместо этого я хочу плавно перезагрузить существующий UITableView – pawelini1
, а затем перезагружает таблицу в файле selectse/check cell. – Ranga