NSOutlineView reloadItem:无效

时间:2013-11-13 19:51:13

标签: cocoa nstableview nsoutlineview

我正试图在基于视图的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];   
}

我在这里错过了什么吗?

更新

正如评论中所指出的,我的outlineView是基于视图的。

更新2

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

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

nil ->firstLevelA ->secondLevel1
                  ->secondLevel2
    ->firstLevelB ->secondLevel3
                  ->secondLevel4

要尝试继承NSOutlineView并同时重写reloadItem:

更新3

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

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:8)

这真的不是一个错误 - 这是我明确设计的。我的想法是reloadItem(etc)应该只重新加载大纲视图项属性,而不是那个项目的表格单元格,因为它没有提供有关重新加载内容的足够的特定信息(例如你可能想要重新加载的特定单元格) )。我原本打算让人们使用reloadDataForRowIndexes:columnIndexes:重新加载基于特定视图的tableview单元格;当基类只需几行代码即可轻松完成相同的操作时,我们通常不会提供封面方法。

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

请记录一个错误,要求Apple更改此内容。

感谢, -corbin

答案 2 :(得分:4)

Apple似乎已“修复”了它。

WWDC 2016,在视频中30:35发表演讲203“Cocoa的新内容”:

“NSOutlineView

  • 当调用reloadItem()“
  • 时,重新加载与”item“关联的单元格视图

答案 3 :(得分:2)

reloadItem:仅适用于macOS 10.12。

从发行说明: https://developer.apple.com/library/content/releasenotes/AppKit/RN-AppKit/

  

NSOutlineView现在将重新加载与“item”关联的单元格视图   何时调用[outlineView reloadItem:]。该方法只是调用   [outlineView reloadDataForRowIndexes:columnIndexes:]传递   要重新加载的特定行以及所有列。对于   兼容性,这仅适用于链接的应用程序   10.12 SDK。

因此,如果要在早期系统上重新加载行,则应使用-reloadDataForRowIndexes:columnIndexes:。 这样的事情:

let index = outlineView.row(forItem: obj)
let rowIndex = IndexSet(integer: index)

let cols = IndexSet(0 ... outlineView.numberOfColumns) 

outlineView.reloadData(forRowIndexes: rowIndex, columnIndexes: cols)