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