0
我有一个应用程序需要在某些列中异步更新单元格。我有一个GCD队列,其中添加了块,稍后获取使用-rowForItem:
给出的行和列的单元格,但-rowForItem:
的结果始终为0,并且每次都抛出NSAssert([self.outlineView itemAtRow:row] == item, @"rowForItem: and itemForRow: not reversible! (Item %@, row %ld)", item, (long)row);
。我没有看到我在这里做错了什么。该索引不是-1,这意味着该项目未找到,但该项目被认为位于不正确的索引处。 (第一项总是JODirectoryInfo,我只上JOFileInfo运行块,所以它不可能是错误的项目。)NSOutlineView rowForItem:总是返回0
- (NSTableCellView *)_cellForRow:(NSInteger)row columnIdentifier:(NSString *)column {
if (row < 0) return nil;
NSInteger colIdx = [self.outlineView columnWithIdentifier:column];
if (colIdx == -1) return nil;
if (colIdx + 1 > self.outlineView.tableColumns.count) return nil;
return [self.outlineView viewAtColumn:colIdx row:row makeIfNecessary:NO];
}
- (NSTableCellView *)_cellForItem:(id)item columnIdentifier:(NSString *)column {
NSInteger row = [self.outlineView rowForItem:item];
NSAssert([self.outlineView itemAtRow:row] == item, @"rowForItem: and itemForRow: not reversible! (Item %@, row %ld)", item, (long)row);
DDLogVerbose(@"Getting cell for item %@ (row %ld) in column %@", item, (long)row, column);
return [self _cellForRow:row columnIdentifier:column];
}
- (dispatch_block_t)_loadingBlockForItem:(JOFileInfo *)item block:(JOFileInfoBlock)block column:(NSString *)columnIdentifier {
return ^{
NSTableCellView *cellView = [self _cellForItem:item columnIdentifier:columnIdentifier];
if (!cellView) return;
cellView.objectValue = block(item);
};
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
DDLogVerbose(@"Requested value of column %@ for item %@", tableColumn.identifier, item);
if ([tableColumn.identifier isEqualToString:@"Size"]) {
if ([item isKindOfClass:[JOFileInfo class]]) {
dispatch_async(self.queue, [self _loadingBlockForItem:item block:^(JOFileInfo *item) {
unsigned long long size = item.size;
if (size != ULONG_LONG_MAX) return [self.byteCountFormatter stringFromByteCount:size];
else return @"--";
} column:tableColumn.identifier]);
return @"--";
} else {
return @"--";
}
} else {
return @"text";
}
}