Обнаружение наведения мыши в NSCell NSTableView? - PullRequest
8 голосов
/ 07 мая 2010

Я хочу изменить цвет фона текста в ячейке табличного представления при наведении на него, подобно тому, как AddressBook «подсвечивает» метку элемента контакта, когда вы наводите указатель мыши на имени метки.Однако я не могу понять, как выполнить ...

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

Поскольку NSCell не является подклассом NSView, это кажется очень сложной задачей.

Любой пример этого или объяснение того, как это может быть сделано, будет оченьоценил.

Спасибо!

Ответы [ 3 ]

10 голосов
/ 08 мая 2010

Я на самом деле заставил его работать другим методом. Я понял это из приведенного здесь примера ... http://www.cocoadev.com/index.pl?NSTableViewRollover https://web.archive.org/web/20111013060111/http://cocoadev.com/index.pl?NSTableViewRollover

Вместо использования механизма отслеживания NSCell я отслеживаю mouseEntered / mouseExited и mouseMoved в моем подклассе NSTableView.

  1. Когда вызывается метод awakeFromNib табличного представления, я создаю trackingRect из видимой части табличного представления

  2. У меня есть BOOL ivar, для которого установлено значение YES, когда мышь находится в пределах области отслеживания (mouseEntered), и NO, если это не так (mouseExited)

  3. В методе mouseMoved я определяю текущую строку, на которой находится курсор мыши, и устанавливаю для нее значение NSInteger ivar, а затем вызываю setNeedsDisplayInRect табличного представления: передавая прямоугольник строки, на которой находится мышь.

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

  5. Наконец, в делегате моего табличного представления я определяю выбранную строку (извлекая индекс строки из ивара NSInteger табличного представления и изменяю цвет текста ячейки (или что угодно), если текущая нарисованная ячейка соответствует строка, в которой включен курсор мыши. Все это делается в методе делегата: tableView: (NSTableView *) aTableView willDisplayCell: (id) aCell forTableColumn: (NSTableColumn *) aTableColumn row: (NSInteger) rowIndex

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

Кстати, есть ли способ сделать конкретный элемент управления в представлении всегда первым firstResponder и ничто иное, как firstResponder? Даже такой метод, как айфоны ... метод viewWillAppear поможет, так как я мог бы установить первый респондент каждый раз, когда вид видим ... но я не знаю такого метода на Mac.

3 голосов
/ 07 мая 2010

В целом, это не простая задача, как вы заметили.

Чтобы отследить мышь в NSCell, подкласс NSCell и переопределить

-[NSCell startTrackingAt:inView:]   

и

-[NSCell stopTracking:at:inView:mouseIsUp:]      

Как только вы обнаружили, что мышь отслеживает внутри ячейки, вы можете узнать, в какой ячейке вы находитесь в таблице с помощью [tableView rowAtPoint:point] и [tableView columnAtPoint:point], а затем найти кадр с помощью [tableView frameOfCellAtColumn:column row:row] Затем вы можете изменить способ прорисовки вашей ячейки, изменив некоторые свойства ячейки или изменив способ ее прорисовки, переопределив drawInteriorWithFrame:inView:.

Вот документация по подклассам NSCell: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ControlCell/Tasks/SubclassingNSCell.html

0 голосов
/ 13 февраля 2015

Я достиг чего-то похожего, используя addGlobalMonitorForEventsMatchingMask: handler: из NSEvent в моем подклассе NSTableView для NSMouseMovedMask. используя это вместе с columnAtPoint и rowAtPoint из NSTableView, я смог выяснить, было ли положение мыши в данной ячейке.

Используя эту информацию, я смог вызвать PopOver, когда мышь находилась над определенной ячейкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...