我有一个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
如果可以实现其他委托方法来解决此问题,我很想知道。