Обеспечение возможности использования NSBrowser при обновлении - PullRequest
0 голосов
/ 27 августа 2018

У меня есть 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

Если есть смысл реализовать другиеделегировать методы, чтобы прояснить это, мне было бы интересно узнать это.

...