Я желаю изменить цвет фона текста на ячейке tableview, когда он колеблется на, подобный тому, как AddressBook "выделяет" маркировку элемента контакта когда Вы наведение мыши имена маркировки. Однако я не могу выяснить, как выполнить...
обнаружение наведения мыши на конкретном NSCell и... После обнаружения ячейки его колебавшийся на, выделяя текст в той ячейке (не выделяющий всю строку, как будто пользователь выбрал ту строку),
Поскольку NSCell не является подклассом NSView, это, кажется, очень трудная задача.
Любой пример этого или объяснения о том, как это могло бы быть сделано, будет значительно цениться.
Спасибо!
Я действительно заставил это работать другим способом. Я получил это из примера, размещенного здесь ... http://www.cocoadev.com/index.pl?NSTableViewRollover
https://web.archive.org/web/20111013060111/http:// cocoadev.com/index.pl?NSTableViewRollover
Вместо использования механизма отслеживания NSCell я отслеживаю mouseEntered / mouseExited и mouseMoved в моем подклассе NSTableView.
Когда вызывается метод tableview awakeFromNib, я создаю trackingRect из видимой части tableview
У меня есть BOOL ivar, для которого установлено значение YES, когда мышь находится в области отслеживания (mouseEntered), и NO, когда она is not (mouseExited)
В методе mouseMoved я определяю текущую строку, в которой находится курсор мыши, и устанавливаю для нее значение NSInteger ivar, а затем вызываю setNeedsDisplayInRect представления таблицы: передавая прямоугольник строки, в которой находится указатель мыши.
Я также переопределяю resetCursorRects, чтобы удалить старый прямоугольник отслеживания и добавить новый ... этот метод вызывается при прокрутке таблицы, чтобы отслеживать последний видимый прямоугольник.
Наконец, в моем делегате табличного представления я определяю выбранную строку (извлекая индекс строки из NSInteger ivar представления таблицы и меняя цвет текста ячейки (или что угодно), если текущая нарисованная ячейка совпадает с строкой, на которую указывает мышь. курсор включен. Все это делается в методе делегата: tableView: (NSTableView *) aTableView willDisplayCell: (id) aCell forTableColumn: (NSTableColumn *) aTableColumn row: (NSInteger) rowIndex
Надеюсь, это поможет другим, так как это было немного сложно.Также, вероятно, важно убедиться, что tableview является firstResponder при загрузке представления, просто делает вещи немного более упорядоченными и чище.
Кстати, есть ли способ сделать так, чтобы конкретный элемент управления в представлении всегда был firstResponder, и ничто другое не могло быть firstResponder? Даже такой метод, как iPhone ... viewWillAppear, поможет, поскольку я мог бы установить первого респондента каждый раз, когда вид будет видимым ... но я не знаю о таком методе на Mac.
В целом, как вы заметили, это непростая задача.
Чтобы отслеживать мышь в 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