无需动画即可重新加载UITableView

时间:2012-04-12 07:18:15

标签: iphone uitableview

我想要实现的是UITableView快速重装。每个单元格都有“检查”UIButton wchich告诉用户选择了该单元格的项目。所有选定的单元格应位于列表的末尾(底部单元格)。

我正在使用NSFetchResultsController作为UITableView的委托和数据源。 NSFetchResultsController被设置为使用“Item”实体操作,其中sectionKey被选中用于“checked”属性(部分od“Item”实体)

- (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(Item实体)中的“checked”属性并保存上下文。然后我的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;
    }
}

因为我更改了“checked”属性,这是我的NSFetchedResultsController的sectionKey,UITableView应该用这个场景重新加载

case NSFetchedResultsChangeMove:
                [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                                 withRowAnimation:UITableViewRowAnimationNone];
                [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                                 withRowAnimation:UITableViewRowAnimationNone];
                break;

这是一个问题,因为当插入或关闭单元格时,UITableView会执行持续时间约为0.5秒的动画。在这段时间内,UITableView停止为下一个单元格重新发送事件,因此当用户“检查”另一个单元格时,将不会通知该单击。我想要实现的是让用户快速检查一些单元格,而无需等待动画结束。

可能的解决方案:

  1. 使用reloadData而不是deleteRowsAtIndexPaths / insertRowsAtIndexPaths。这将是没有动画,但重新加载所有UITableView持续时间更长,重新加载一个单元格,所以在我的情况下,用户将等待UITableView重新加载 - 再次等待。有没有办法避免动画而不重新加载所有UITableView?

  2. 允许用户检查单元格,但仅在最后一个单元格选择后0.5秒后保存上下文。用户可以选择快速多个单元格,当他结束选择时,所有更改都会传播到UITableView - 我的老板想要将每个选定的单元格发送到第二部分而不进行分组,然后为每个选定的单元格重新加载 - 再次是坏主意

  3. 也许是一些自定义tableView(用户创建,而不是苹果)?

  4. 主要目标:

    允许用户在每次“检查”

    后“检查”单元格快速刷新UITableView

    我愿意接受任何理想:)

1 个答案:

答案 0 :(得分:0)

重新载入你的桌子 - (void)viewDidAppear:(BOOL)动画

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

    [yourTable reloadData];



}