我有一个NSBrowser
显示 2 列数据,这些数据是在我的应用程序运行时在其他几个线程上计算的。我要解决的问题是允许用户在数据仍在进入时与浏览器交互。现在,当后台线程指示要显示新行时,我调用-[NSBrowser reloadColumn:0]
. 当用户只是查看第 0 列中的数据时,此方法有效。但是,如果他们尝试选择第 0 列中的项目,应用程序调用 时,它将立即取消选择reloadColumn:0
。数据通常以每秒数百行的形式出现。
作为一种解决方法,我尝试在调用之前获取当前选择reloadColumn:0
,然后立即重置它。这会根据需要保持选择,但如果用户将选择滚动到视图之外,则一旦重新加载列,滚动位置就会弹回以包括选定的行。尝试使用该selectionIndexPath
属性具有相同的效果。
所以看来我必须选择:
- 用户的选择每隔几秒就会消失
- 不允许用户将选择滚动到屏幕外
这些都不是很有用。我也尝试过-[NSBrowser reloadDataForRowIndexes:inColumn:
仅调用“重新加载”(或实际加载)新行,但这显然不会加载尚未加载的行。基本上,加载第一行后,不再显示其他行。
我还尝试调用-loadedCellAtRow:Column:
每个新创建的行,它也不会导致之前未加载的任何内容被加载。
有没有办法让这个工作不会惹恼用户?
对于它的价值,我NSBrowserDelegate
在我的应用程序中实现了以下方法:
- (BOOL)browser:(NSBrowser *)browser isColumnValid:(NSInteger)column
- (NSString*)browser:(NSBrowser *)sender titleOfColumn:(NSInteger)column
- (void)browser:(NSBrowser *)browser willDisplayCell:(nonnull id)cell atRow:(NSInteger)row column:(NSInteger)column
- (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column
- (NSInteger)browser:(NSBrowser *)browser numberOfChildrenOfItem:(id)item;
- (id)browser:(NSBrowser *)browser child:(NSInteger)index ofItem:(id)item;
- (id)browser:(NSBrowser *)browser objectValueForItem:(id)item;
- (id)rootItemForBrowser:(NSBrowser *)browser;
- (BOOL)browser:(NSBrowser *)browser isLeafItem:(id)item
如果实现其他委托方法来解决这个问题是有意义的,我很想知道这一点。