2015-08-03 2 views
0

У меня есть NStableView, основанный на NSView. В каждой строке также есть NSImageView, который является подзадачей NSView. Я подклассифицировал этот NSImageView, затем переопределил mouseDown метод. Проблема tableViewSelectionDidChange также запускается, когда пользователь нажимает на это изображение. Я хочу только mouseDown будет вызываться, но не tableViewSelectionDidChange.Правильное поведение мыши внутри строки NSTableView?

Если установить selectionHighlightStyle таблицы в NSTableViewSelectionHighlightStyle.None только тогда MouseDown зрения изображения называется. И если я не дам selectionHighlightStyle к NSTableViewSelectionHighlightStyle.None тогда как MouseDown из ImageView и tableViewSelectionDidChange становятся называется. Установка selectionHighlightStyle никому, кажется, не разрешает мою проблему, но верно ли это? Или я получаю это поведение из-за ошибки в appkit?

Также я не могу найти, чтобы это поведение было зарегистрировано где-то.

ответ

1

Я думаю, что правильный подход вы бы подкласс NSTableView и переопределить метод NSResponder -(BOOL)validateProposedFirstResponder:(NSResponder *)responder forEvent:(NSEvent *)event

вы будете иметь контроль над более тонкой, по которому вид получит событие мыши, и не придется прибегать к «повозка, запряженная волами «как изменение стиля выбора вида таблицы.

Из яблока документов:

Указания Как подвиды должны реагировать на события

Просмотров или элементы в таблице иногда нужно отвечать на входящие события. Чтобы определить, должно ли конкретное подвью получать текущее событие мыши, представление таблицы вызывает validateProposedFirstResponder: forEvent: в его реализации hitTest. Если вы создаете подкласс таблицы, вы можете переопределить validateProposedFirstResponder: forEvent: указать, какие представления могут стать первым ответчиком. Таким образом, вы получаете события мыши.

по умолчанию реализации NSTableView из validateProposedFirstResponder: forEvent: использует следующую логику:

Return YES для всех предложенного первого вида ответчиков, если они не являются экземплярами или подклассы NSControl. Определите, является ли предлагаемый первый ответчик экземпляром или подклассом NSControl.

Если элемент управления является объектом NSButton, верните YES.

Если контроль не является NSButton, вызов элемента управления hitTestForEvent: inRect: ofView: видеть ли это хит область отслеживается (то есть, NSCellHitTrackableArea) или редактируемая область текста (то есть, NSCellHitEditableTextArea), и возвращение соответствующее значение. Обратите внимание: если текстовая область ударяется, NSTableView также задерживает действие первого ответчика.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/RowSelection/RowSelection.html#//apple_ref/doc/uid/10000026i-CH6-SW9

+0

Спасибо. Я подклассифицировал его и вернул true для условия моей проблемы. Работает отлично. – Abhishek

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