Обеспечение возможности использования 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 ответов

Другие вопросы по тегам