Определение того, какой экземпляр NSView инициировал mouseDown: - PullRequest
1 голос
/ 25 июня 2009

У меня есть игровая доска с 25 плитками myGameTile, подкласса NSView. В mouseDown: я хочу определить, на какой плитке я щелкнул, и задать для ивара репрезентативное значение.

например. Если я нажму на плитку 12, установите для clickedTile значение «12» или какое-либо значение, которое уникально представляет этот конкретный экземпляр.

Я открываю что угодно, от целочисленного значения 12 до самого интроспекции / отражения, хотя встроенные функции и элегантность предпочтительнее хаков, оболочек времени выполнения и модификаций. Тем не менее, я знаю, что у меня может не быть иного выбора, кроме как полагаться на эти решения, поэтому, пожалуйста, ответьте и на них. Я хотел бы знать все мои варианты. Спасибо!

Ответы [ 3 ]

5 голосов
/ 25 июня 2009

Вы можете создать подкласс NSView и переопределить метод тега , как написано в документации.

1 голос
/ 26 июня 2009

У вас есть несколько возможностей:

Если вы обрабатываете mouseDown в представлении Tile, вам необходимо сопоставить себя с ID плитки. Есть три простых способа сделать это:

  • Предварительно настройте Tile.tag в качестве идентификатора плитки, затем используйте self.tag.
  • Поиск плитки в массиве плиток, чтобы найти индекс [parent.tiles indexOfObject: self]
  • Создание сопоставления словаря. Плитка или идентификатор плитки [[parent.tiles objectForKey: self] intValue]

Очевидно, что использовать тег проще всего, если вы не используете тег для чего-либо еще.

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

0 голосов
/ 25 июня 2009

Я думаю, HitTest: будет делать то, что вы хотите. Примерно так:

- (void)mouseDown:(NSEvent *)theEvent {
    NSPoint aPoint = [theEvent locationInWindow];
    NSView* viewHit = [self hitTest:aPoint];
    if( viewHit != nil && viewHit != self ) {
        // viewHit is our tile.
    }
}
...