在更新时使NSBrowser可用

时间:2018-08-26 21:45:34

标签: objective-c macos cocoa nsbrowser

我有一个NSBrowser,它显示2列数据,这些数据是在我的应用程序运行时在其他几个线程上计算得出的。我要解决的问题是允许用户在数据仍在输入时与浏览器进行交互。现在,当后台线程指示有新行要显示时,我调用-[NSBrowser reloadColumn:0]。当用户仅查看第0列中的数据时,此方法有效。但是,如果他们尝试选择第0列中的项目,则应用会在调用reloadColumn:0后立即取消选择该项目。数据通常以每秒数百行的速度进入。

作为一种解决方法,我尝试在调用reloadColumn:0之前获取当前选择,然后立即将其重置。这样可以将选择保留在期望的位置,但是如果用户将选择从视图中滚动出,则在重新加载列后,滚动位置就会弹出以返回到包括所选行的位置。尝试使用selectionIndexPath属性具有相同的效果。

所以看来我必须在以下两者之间进行选择:

  1. 用户的选择每隔几秒钟就会消失
  2. 不允许用户在屏幕上滚动选择内容

这些都不是很有用。我还尝试调用-[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

如果可以实现其他委托方法来解决此问题,我很想知道。

0 个答案:

没有答案