Как вызвать программный метод autoscroll NSScrollView

У меня есть приложение для простого чата с текстовыми сообщениями, основанными на представлении NSTableView, как вы можете видеть на рисунке ниже. enter image description here Каждое сообщение содержит экземпляр NSTextView, имеющий высоту, соответствующую всем текстам.

Все, что мне нужно - это запустить NSScrollView (который включен в NSTableView-экземпляр), а пользователь выбирает текст, перетаскивая мышью достаточно далеко. К сожалению, автопрокрутка не появляется. В случае перетаскивания где-то за пределы текстовых представлений все удаются.

Я попытался вызвать autoscroll: -метод непосредственно, просто нажав NSEvent -instance из NSTextView -subclass "мышь перетащила" -event (как в примере из в этой статье):

- (void)mouseDragged:(NSEvent *)event
{
  [self.scrollView autoscroll:event];
}

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

UPDATE

Я понял, что перед вызовом -autoscroll: -метода должен быть -mouseDown: того же самого объекта. Но это нарушает мой механизм выбора текста. Дело даже не в том, чтобы быть первым ответчиком, не должно быть ничего, кроме метода mouseDown:.

Ответы

Ответ 1

Обычно текстовое представление находится внутри собственного представления прокрутки. Даже если это достаточно большое, чтобы показать весь текст без прокрутки, он все еще там. Вызов -autoscroll: на что-либо в этом представлении прокрутки (возможно, включая это представление прокрутки?) Просто попробует прокрутить это представление прокрутки, а не прокрутку, содержащую представление таблицы.

Попробуйте вызвать -autoscroll: в представлении выше в иерархии. Либо self.scrollView.superview, вид ячейки таблицы, либо представление таблицы.

Обратите внимание, однако, что представление прокрутки в виде таблицы будет продолжать прокручиваться даже после полного отображения вида ячеек, содержащего текстовое представление. Фактически, он может продолжать прокручивать его до тех пор, пока он не появится на экране в другом направлении. В принципе, он не знает, что вы пытаетесь выбрать в текстовом представлении, чтобы он не знал, чтобы остановить, когда выбор полностью простирается до края текстового вида.

Другой подход может заключаться в том, чтобы попытаться использовать "голый" текстовый вид без охвата прокрутки. Я не думаю, что IB позволит вам это сделать, поэтому вам придется делать это программно. Тем не менее, нечеткие текстовые представления не очень хорошо сочетаются с автоматической компоновкой.