2014-01-06 20 views
0

我有一個小問題。也許有人可以幫忙。將行添加到NSTableView而不等待方法完成

我有一個將行添加到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] 
    }); 
} 
+0

謝謝indragie,你的建議一直很有幫助。 – Walter

+0

很高興聽到。如果這個答案對你有幫助,如果你將它標記爲正確,我將不勝感激。 – indragie