我有一个小问题。也许有人可以帮忙。
我有一个向NSViewTable添加行的例程。在每个addObject之后,我发出一个reloadData,因为我希望逐行显示这些行,但是,我得到的是暂停,然后所有行一次出现。涉及到一些处理,并且随着子处理的完成逐行显示行将成为一个很好的进度指示器。
有人知道是否有办法让行逐一显示,因为它们被添加而不是暂停,然后所有行一次出现?
非常感谢,
答案 0 :(得分:3)
调用-reloadData
会产生您所看到的行为:它会重新加载整个表格视图。这是一项非常昂贵的操作,只应在最初加载数据集或完全替换数据集时进行。对于您的增量更新,请使用-[NSTableView insertRowsAtIndexes:withAnimation:]
。
我假设您正在询问如何逐个动画每一行。为此,您可能希望使用dispatch_after()
将每行的插入错开一个固定的秒数,以分别创建每行动画效果。
示例(假设您要将对象添加到数组的末尾):
// objectsToAdd is the array of objects that you're adding to the existing array
// self.objectArray is the existing array of objects
NSArray *objectsToAdd = ...
NSUInteger existingCount = self.objectArray.count;
NSUInteger addedCount = objectsToAdd.count;
[self.objectArray addObjectsFromArray:objectsToAdd]
// Delay between each row animating in
const double delayInSeconds = 0.2;
for (NSUInteger i = existingCount; i < (existingCount + addedCount); i++) {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * i * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:i] withAnimation:NSTableViewAnimationSlideLeft]
});
}