обнаружение наведения мыши в NSCell NSTableView?

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

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

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

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

Спасибо!

8
задан Patrick 7 May 2010 в 06:53
поделиться

2 ответа

Я действительно заставил это работать другим способом. Я получил это из примера, размещенного здесь ... 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. Когда вызывается метод tableview awakeFromNib, я создаю trackingRect из видимой части tableview

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

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

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

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

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

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

10
ответ дан 5 December 2019 в 12:56
поделиться

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

Чтобы отслеживать мышь в 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

3
ответ дан 5 December 2019 в 12:56
поделиться