Objective c 在NSTableView中加载图像时的奇怪行为
我正在用GCD加载图像,我有一些奇怪的行为 当您在表格视图中滚动时,每个相册都开始提取艺术品。Objective c 在NSTableView中加载图像时的奇怪行为,objective-c,macos,cocoa,nstableview,nstablecellview,Objective C,Macos,Cocoa,Nstableview,Nstablecellview,我正在用GCD加载图像,我有一些奇怪的行为 当您在表格视图中滚动时,每个相册都开始提取艺术品。 NSTableCellView快速显示许多错误的作品,直到一秒钟后,它最终显示正确的作品,然后停止 显然,这意味着,在调度之后,NSTableCellView的变量不再指向同一实例,这会导致反复更改同一单元格的图像 我试图通过调用分派块中的viewAtColumn:row:indexOfObject:来解决这个问题,但它没有解决这个问题 有什么建议吗 代码 您使用可重用的单元格,因此当单元格隐藏在边
NSTableCellView
快速显示许多错误的作品,直到一秒钟后,它最终显示正确的作品,然后停止
显然,这意味着,在调度之后,NSTableCellView
的变量不再指向同一实例,这会导致反复更改同一单元格的图像
我试图通过调用分派块中的viewAtColumn:row:indexOfObject:
来解决这个问题,但它没有解决这个问题
有什么建议吗
代码
您使用可重用的单元格,因此当单元格隐藏在边界之外时,可以重用它来显示另一个数据。快速修复:
- (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];
static int tag = 0;
tag++;
int tagForBlock = tag;
cellView.tag = tag;
if (![self._imageCache objectForKey:album]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSImage *artwork = album.artwork;
if (!artwork || !artwork.isValid) artwork = [NSImage imageNamed:@"noArtwork"];
[self._imageCache setObject:artwork forKey:album];
dispatch_async(dispatch_get_main_queue(), ^{
if(tagForBlock != cellView.tag)
return;
NSTableCellView *tcv = [self.tableView viewAtColumn:0 row:[self.tableContent indexOfObject:album] makeIfNecessary:NO];
tcv.imageView.image = artwork;
});
});
} else {
cellView.imageView.image = [self._imageCache objectForKey:album];
}
return cellView;
}
没有
setTag:
方法,属性为只读。我应该使用什么来代替呢?)什么样的类ITAlbumTableCellView?UtableViewCell?您只需要确定单元格中存在哪些数据。没关系,我为NSTableCellView
子类添加了一个新属性,它现在可以工作了,谢谢!不,它是NSTableCellView
阅读标题,我写了NSTableView,并且只添加了OSX标记
- (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];
static int tag = 0;
tag++;
int tagForBlock = tag;
cellView.tag = tag;
if (![self._imageCache objectForKey:album]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSImage *artwork = album.artwork;
if (!artwork || !artwork.isValid) artwork = [NSImage imageNamed:@"noArtwork"];
[self._imageCache setObject:artwork forKey:album];
dispatch_async(dispatch_get_main_queue(), ^{
if(tagForBlock != cellView.tag)
return;
NSTableCellView *tcv = [self.tableView viewAtColumn:0 row:[self.tableContent indexOfObject:album] makeIfNecessary:NO];
tcv.imageView.image = artwork;
});
});
} else {
cellView.imageView.image = [self._imageCache objectForKey:album];
}
return cellView;
}