我正试图在基于视图的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是基于视图的。
尝试一些东西让我意识到我正在重新加载的对象是一个二级对象(参见对象树),调用reloadItem:firstLevelObject reloadChildren:YES
确实有效。
我们是否有可能只能在第一级对象上调用reloadItem:在我的情况下,这将是非常低效的(我只有一个两级项目和大量第二级别)!
nil ->firstLevelA ->secondLevel1
->secondLevel2
->firstLevelB ->secondLevel3
->secondLevel4
要尝试继承NSOutlineView并同时重写reloadItem:
。
我看一下NSOutlineView in Cocotron开始,觉得我需要写的代码来覆盖reloadItem会很安静。有人确认吗?
答案 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
答案 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)