Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在NSTableView中加载图像时的奇怪行为_Objective C_Macos_Cocoa_Nstableview_Nstablecellview - Fatal编程技术网

Objective c 在NSTableView中加载图像时的奇怪行为

Objective c 在NSTableView中加载图像时的奇怪行为,objective-c,macos,cocoa,nstableview,nstablecellview,Objective C,Macos,Cocoa,Nstableview,Nstablecellview,我正在用GCD加载图像,我有一些奇怪的行为 当您在表格视图中滚动时,每个相册都开始提取艺术品。 NSTableCellView快速显示许多错误的作品,直到一秒钟后,它最终显示正确的作品,然后停止 显然,这意味着,在调度之后,NSTableCellView的变量不再指向同一实例,这会导致反复更改同一单元格的图像 我试图通过调用分派块中的viewAtColumn:row:indexOfObject:来解决这个问题,但它没有解决这个问题 有什么建议吗 代码 您使用可重用的单元格,因此当单元格隐藏在边

我正在用GCD加载图像,我有一些奇怪的行为

当您在表格视图中滚动时,每个相册都开始提取艺术品。
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;
}