2015-05-27 9 views
16

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

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

Я пытался позвонить autoscroll: -методу непосредственно просто нажмите NSEvent -instance из NSTextView -subclass «мыши тащил» -Event (как в примере с this article):

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

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

UPDATE

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

+0

Если вы говорите, что с помощью NSTableView внутри NSScrollView, а строки NSTableView являются многострочными, а при выборе текста внутри ячейки и перетаскивании вниз под низу прокрутки оно не прокручивается? Если это так, то эта функция предоставляется автоматически NSScrollView, и при прокрутке ничего не требуется для прокрутки. Для тестирования я создал новый проект, добавил NSScrollView (NSTableView), установил высоту строки больше, чем просмотр прокрутки, и заполнил таблицу. Нажав на текст, а затем выберите нижнюю часть прокрутки. Он прокручивается автоматически. – Jay

+0

@Jay Мне нужно запустить автопрокрутку прокрутки NSTableView, а не текстовое представление (текстовое представление имеет достаточно высоту, чтобы соответствовать тексту). – Astoria

+0

Я не уверен, что вы просите. Предполагая, что вы используете NSTableView из библиотеки объектов в окне в Xcode, NSTableView будет заключен в NSScrollview.Если вы пытаетесь выбрать текст в строке в виде таблицы, щелкнув мышью в строке, где текст и перетаскивается вниз (как это показано на снимке экрана, прилагаемый NScrollView обрабатывает это автоматически и будет прокручиваться так, чтобы вы можете продолжать выбирать текст. – Jay

ответ

2

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

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

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

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

+0

Вызов '-autoscroll:' (в представлении таблицы или его охватывающем прокрутке) с событием, взятым из параметра -mouseDragged: ', ничего не вызывает. Может быть, я должен каким-то образом мутировать «NSEvent». – Astoria

Смежные вопросы