NSOutlineView reloadItem:无效

Ber*_*ron 16 cocoa nsoutlineview nstableview

我试图在基于视图的基础上释放一些压力,NSOutlineView为此我更改了单项属性,并且我最初使用时重新加载[myOutlineView reloadData].

我尝试 [myOutlineView reloadItem: myOutlineViewItem]但它从不调用- (NSView *)outlineView:(NSOutlineView *)ov viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item,因此数据不会更新.

-(void)reloadOutlineViewObject
{
    //[myOutlineView reloadData];   //Reload data just fines but is ressource-hungry
    NSLog(@"%d",[myOutlineView rowForItem:myOutlineViewItem]; //Making sure my object is an item of the outlineView, which it is !
    [myOutlineView reloadItem:myOutlineViewItem];   
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

UPDATE

正如评论中指出的那样,我的outlineView是基于视图的.

更新2

尝试一些东西让我意识到我正在重新加载的对象是一个二级对象(cf对象树)并且调用reloadItem:firstLevelObject reloadChildren:YES确实有效.

是否有可能我们只能在第一级对象上调用reloadItem:在我的情况下,这将是非常低效的(我只有一个两级项目和大量的第二级)!

nil ->firstLevelA ->secondLevel1
                  ->secondLevel2
    ->firstLevelB ->secondLevel3
                  ->secondLevel4
Run Code Online (Sandbox Code Playgroud)

要尝试子类化NSOutlineView并reloadItem:在同一时间重写.

更新3

我看了一下Cocotron中的NSOutlineView来开始,并觉得我需要写的代码来覆盖reloadItem会很安静.有人确认吗?

Bri*_*ter 15

我在基于视图的大纲视图中遇到了同样的问题,其中调用-reloadItem:似乎没有做任何事情.这绝对看起来像一个大错误,虽然文档没有明确说明reloadItem将重新获取该行的视图.

我的解决方法是调用NSTableView's -reloadDataForRowIndexes:columnIndexes:,它似乎按预期工作,触发对该项的-outlineView:viewForTableColumn:item:委托方法的调用.您可以通过调用-rowForItem:并传入要重新加载的项来获取需要重新加载的行.


cor*_*unn 9

这真的不是一个错误 - 这是我明确设计的.我的想法是reloadItem(etc)应该只重新加载大纲视图项属性,而不是那个项目的表格单元格,因为它没有提供关于重新加载什么的足够的特定信息(例如你可能想要重新加载的特定单元格).我原本打算让人们使用reloadDataForRowIndexes:columnIndexes:重新加载基于特定视图的tableview单元格; 当基类只用几行代码就可以很容易地做同样的事情时,我们通常不提供覆盖方法.

然而,话虽如此,我知道有很多人对此感到困惑,大多数人都希望它能够重新加载这个细胞.

请记录一个错误,要求Apple更改此信息.

谢谢,-corbin