我想要实现的是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停止为下一个单元格重新发送事件,因此当用户“检查”另一个单元格时,将不会通知该单击。我想要实现的是让用户快速检查一些单元格,而无需等待动画结束。
可能的解决方案:
使用reloadData而不是deleteRowsAtIndexPaths / insertRowsAtIndexPaths。这将是没有动画,但重新加载所有UITableView持续时间更长,重新加载一个单元格,所以在我的情况下,用户将等待UITableView重新加载 - 再次等待。有没有办法避免动画而不重新加载所有UITableView?
允许用户检查单元格,但仅在最后一个单元格选择后0.5秒后保存上下文。用户可以选择快速多个单元格,当他结束选择时,所有更改都会传播到UITableView - 我的老板想要将每个选定的单元格发送到第二部分而不进行分组,然后为每个选定的单元格重新加载 - 再次是坏主意
也许是一些自定义tableView(用户创建,而不是苹果)?
主要目标:
允许用户在每次“检查”
后“检查”单元格快速刷新UITableView我愿意接受任何理想:)
答案 0 :(得分:0)
重新载入你的桌子 - (void)viewDidAppear:(BOOL)动画
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[yourTable reloadData];
}