2012-04-12 5 views
4

То, что я пытаюсь достичь, - это перезагрузка 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 перестает получать события для следующей ячейки, поэтому, когда пользователь «проверяет» другую ячейку, он не будет уведомлен об этом постукивании. То, что я пытаюсь достичь, - дать пользователю возможность быстро проверять некоторые ячейки, не дожидаясь окончания анимации.

Возможные решения:

  1. Использование reloadData istead из deleteRowsAtIndexPaths/insertRowsAtIndexPaths. Это будет не анимация, а перезагрузка всего UITableView дольше, чем перезагрузка одной ячейки, поэтому в моем случае пользователь будет ждать перезагрузки UITableView - снова ждет. Есть ли способ избежать анимации без перезагрузки всего UITableView?

  2. Позволяет пользователю проверять ячейки, но сохранять контекст только после 0,5 с после последнего выбора ячейки. Пользователь может выбрать быструю множественную ячейку, и когда он заканчивает выбор, все изменения распространяются на UITableView - мой босс хочет отправить каждую выбранную ячейку во вторую секцию без группировки, тогда одна перезагрузка для каждой выбранной ячейки - снова плохая идея

  3. Возможно, некоторые Пользовательский tableView (пользователь создал, а не яблоко)?

Основная задача:

Разрешить «проверить» клетки быстро освежает UITableView после каждого «проверки»

Я открыт для любых идеалов :)

ответ

0

Обновить таблицу в - (void) viewDidAppear: (BOOL) анимированный

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [yourTable reloadData]; 



} 
+0

Я думаю, мы неправильно понимаем друг друга. viewDidAppear: запускается, когда представление представляется пользователю, но когда пользователь «проверяет» ячейки, я не представляю никакого нового представления, вместо этого я хочу плавно перезагрузить существующий UITableView – pawelini1

+0

, а затем перезагружает таблицу в файле selectse/check cell. – Ranga

Смежные вопросы