iOS:使用没有核心数据的动画更新表视图数据源

时间:2013-08-12 14:21:00

标签: ios uitableview

我想用动画更新表视图的数据源(比如NSFetchedResultsController)但没有核心数据。

可能有添加的对象,删除的对象,移动的对象等等......

有可能吗?

2 个答案:

答案 0 :(得分:3)

看看TLIndexPathTools。它是NSFetchedResultsController的替代方法,除了使用NSFetchRequest和Core Data对象外,还可以使用包含任何类型数据的普通数组。 它提供了一个标准化的数据模型类TLIndexPathDataModel,它可以自动将数据组织成各个部分,并有许多API来简化数据源和委托方法的实现。但它的主要功能是在您更新数据模型时自动为您计算并执行动画批量更新。

尝试运行众多示例项目,以了解可以执行的操作。 Shuffle sample project是一个很好的起点:点击Shuffle按钮,集合视图网格随机重新排列动画。以下是Shuffle视图控制器的完整源代码:

#import "TLCollectionViewController.h"
@interface ShuffleCollectionViewController : TLCollectionViewController <UICollectionViewDelegateFlowLayout>
- (IBAction)shuffle;
@end

#import <QuartzCore/QuartzCore.h>
#import "ShuffleCollectionViewController.h"
#import "TLIndexPathDataModel.h"
#import "UIColor+Hex.h"

#define IDX_TEXT 0
#define IDX_COLOR 1

@implementation ShuffleCollectionViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //initialize the controller with a list data items. To keep it simple, we'll
    //just use two element arrays (text and color) for our items.
    NSArray *items = @[
           @[@"A", [UIColor colorWithHexRGB:0x96D6C1]],
           @[@"B", [UIColor colorWithHexRGB:0xD696A3]],
           @[@"C", [UIColor colorWithHexRGB:0xFACB96]],
           @[@"D", [UIColor colorWithHexRGB:0xFAED96]],
           @[@"E", [UIColor colorWithHexRGB:0x96FAC3]],
           @[@"F", [UIColor colorWithHexRGB:0x6AA9CF]],
           ];
    self.indexPathController.items = items;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath];
    //retrieve the cell data for the given index path from the controller
    //and set the cell's text label and background color
    NSArray *item = [self.indexPathController.dataModel itemAtIndexPath:indexPath];
    UILabel *label = (UILabel *)[cell viewWithTag:1];
    label.text = item[IDX_TEXT];
    cell.backgroundColor = item[IDX_COLOR];
    cell.layer.cornerRadius = 10;
    return cell;
}

- (void)shuffle
{
    //shuffle the items randomly and update the controller with the shuffled items
    NSMutableArray *shuffledItems = [NSMutableArray arrayWithArray:self.indexPathController.items];
    NSInteger count = shuffledItems.count;
    for (int i = 0; i < count; i++) {
        [shuffledItems exchangeObjectAtIndex:i withObjectAtIndex:arc4random() % count];
    }
    self.indexPathController.items = shuffledItems;
}

@end

此示例源自提供的TLCollectionViewController基类,但您可以通过从TLCollectionViewController复制/粘贴轻松地将TLIndexPathTools集成到您自己的视图控制器中(那里几乎没有)。

在某些方面,NSFetchedResultsController也有所改善。首先,您的商品不需要预先排序以组织成部分。其次,您可以进行动画排序和过滤(如果您使用NSFetchedResultsController更改排序描述符或谓词,则您已重新执行获取并且您将无法获得动画)。尝试运行Core Data sample project

当前版本旨在扩展到1000个项目。因此,如果您拥有非常大的数据集,则可能会遇到性能问题。

答案 1 :(得分:0)

感谢@IanL我使用了下一个解决方案:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];