从NSImageCell获取显示的图像

时间:2011-06-20 12:53:48

标签: objective-c cocoa macos nstableview nsimage

我有一个NSImageCell表格列,其valuePath绑定到我的对象通过NSArrayController提供的路径。

我的NSTableViewDelegate实现了-tableView:heightOfRow:方法,以便拥有可变的行高。我需要根据上述列中显示的图像尺寸计算行高。

现在,我的表现很糟糕,因为我每次迭代都会调用[[NSImage alloc] initWithContentsOfFile:<path>]。有没有办法加载每个NSImageCell已经检索过的图像表示形式?

我对使用valuePath绑定所表现出的性能感到满意,并且不愿意自己缓存每个图像,因为会有很多图像,每个都有点大。

我尝试了NSTableColumn方法-dataCellForRow:,听起来很完美,除了返回的单元格返回一个objectValue,它似乎是加载数据的最后一行。

更新(解决方案,不满意)

我想出了一个近似的解决方案(下面同时发布),但它似乎很笨拙(我已经看到它随机失败,不可复制的时间),我仍然在寻找更好的解决方案。

我正在使用-tableView:willDisplayCell:forTableColumn:row:委托方法填充一个可变字典,其中[[cell objectValue] size](图像的大小)键入了所代表对象的唯一ID。然后,在-tableView:heightOfRow:电话中,我正在查找这本字典的封面。我需要在加载数据后调用[tableView noteNumberOfRowsChanged],否则字典未正确填充初始数据屏幕。

1 个答案:

答案 0 :(得分:1)

  

我尝试了NSTableColumn方法-dataCellForRow:,这听起来很完美,除了返回的单元格返回一个objectValue,它似乎是加载数据的最后一行。

这是因为NSTableColumn仅使用单个数据单元格来显示整个列,并在绘制时交换其值。

如果我是你,我可能会尝试在NSTableViewDelegate中实施– tableView:willDisplayCell:forTableColumn:row:方法。然后你可以在它即将被绘制之前截取单元格,在那一刻获得它的值,并缓存它的高度(作为NSNumber*CGFloat)。然后,您可以在-tableView:heightOfRow:中返回 值。

然后,-tableView:heightOfRow:之前可能会调用– tableView:willDisplayCell:forTableColumn:row:,因此可能无效。我不确定。但这就是我要开始的地方。