如何获取NSTableView行动画的插入和删除

时间:2016-04-02 18:40:29

标签: objective-c macos animation nstableview

我正在寻找一个API调用,该调用提供NSMutableIndexSet行以移除和插入NSTableView中的动画行。理想情况下,我应该传递一个旧的和新的数组,以获得最终的删除和插入索引,我在NSTableView或相关协议中看不到类似的内容。

我希望在beginUpdatesendUpdates之间实现动画,如下所示:

[_tableView removeRowsAtIndexes:rowsToRemove withAnimation:NSTableViewAnimationSlideUp];
[_tableView insertRowsAtIndexes:rowsToInsert withAnimation:NSTableViewAnimationSlideDown];

1 个答案:

答案 0 :(得分:2)

我正在使用一个类,有两个属性:

@property (strong, nonatomic) NSIndexSet *rowsToRemove;
@property (strong, nonatomic) NSIndexSet *rowsToInsert;

初始化需要两个数组(旧的和新的),我用它来获取要插入的行和要删除的行的索引:

- (instancetype) initWithOldArray:(NSArray *)oldArray newArray:(NSArray *)newArray
{
    self = [super init];

    if (self) {
        //Get a list of deletion indices
        NSMutableIndexSet *rowsToRemove = [NSMutableIndexSet new];
        NSUInteger numOldItems = oldArray.count;
        for (NSUInteger i = 0; i < numOldItems; i++) {
            id item = oldArray[i];
            if (![newArray containsObject:item]) {
                [rowsToRemove addIndex:i];
            }
        }

        //Get a list of insertion indices
        NSMutableIndexSet *rowsToInsert = [NSMutableIndexSet new];
        NSUInteger numNewItems = newArray.count;
        for (NSUInteger i = 0; i < numNewItems; i++) {
            id item = newArray[i];
            if (![oldArray containsObject:item]) {
                [rowsToInsert addIndex:i];
            }
        }

        self.rowsToRemove = rowsToRemove;
        self.rowsToInsert = rowsToInsert;
    }

    return self;
}