Обеспечение возможности использования NSBrowser при обновлении
У меня есть 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
Если было бы целесообразно реализовать другие методы делегирования, чтобы прояснить это, мне было бы интересно узнать об этом.