NSTableView. Как переопределить поведение автопрокрутки?

У меня есть NSTableView, который отображает (через привязки) данные из NSTreeController. Приложение часто добавляет/изменяет данные в/в связанном массиве.

Проблема в том, что если пользователь выбрал строку в таблице, но прокрутил так, что выбранные данные больше не видны, когда приложение обновляет массив, оно вызывает автоматическую прокрутку дисплея, так что выбранная строка снова на экране. Это очень расстраивает пользователей, тем более что новые данные могут появиться в любое время.

Есть ли способ отключить эту функцию?


person Alexander Stavonin    schedule 11.01.2010    source источник


Ответы (2)


Возможно, вам придется создать подкласс NSTableView и переопределить -scrollRowToVisible:, временно заключив в скобки вызов super. Для этого также может потребоваться пользовательская переменная BOOL в вашем подклассе, чтобы отслеживать, хотите ли вы прокручивать.

Я бы начал с установки точки останова, чтобы увидеть, когда именно срабатывает автопрокрутка. Это должно помочь найти подходящие моменты для переключения ивара.

person Costique    schedule 11.01.2010
comment
Насколько я знаю, решение Costique в настоящее время является единственным способом решения этой проблемы. К сожалению, другие вещи сломаются, если вы просто переопределите -scrollRowToVisible: и не вызовете реализацию super. В моем случае мне пришлось изменить свой сетевой код, чтобы добавить метод класса +isInsertingNewDataFromRemote, а затем заставить мое собственное табличное представление проверять этот флаг изнутри -scrollRowToVisible: и вызывать реализацию super только в том случае, если этот флаг равен NO. - person Mason; 23.01.2012

Вы используете NSTreeController с NSOutlineView или NSArrayController с NSTableView? Использование NSTreeController с NSTableView не имеет для меня особого смысла?

Если вы используете NSTableView, вам, вероятно, следует использовать NSArrayController для управления его данными, и эта перестановка строк является особенностью NSArrayController. Попробуйте отключить параметр Auto Rerange Content на вашем контроллере в IB.

Когда он включен, контроллер массива будет переупорядочивать свои объекты при добавлении, удалении и изменении объектов, что повлияет на порядок сортировки (если есть) и заставит любые представления таблицы или представления схемы перезагрузить свои данные.

Я не знаю подобной функции для NSTreeController, в основном потому, что я ею не пользуюсь, так как она никогда не работала у меня хорошо. К сожалению, я рекомендую просто использовать методы источника данных для NSOutlineView и предоставлять данные по старинке. По моему опыту, NSTreeController хорошо подходит только для самых тривиальных задач.

person Ashley Clark    schedule 12.01.2010
comment
NSTreeController значительно улучшился в версии 10.7; теперь это намного полезнее, чем в предыдущих версиях. - person Mason; 23.01.2012