2009-06-25 6 views
1

У меня есть игровая панель с 25 плитами myGameTile, подкласса NSView. В mouseDown: Я хочу определить, на какую плиту я нажал, и установить ivar на репрезентативное значение.Определение того, какой экземпляр NSView инициировал mouseDown:

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

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

+0

Это плохо озаглавленный вопрос. Я бы предложил изменить его на что-то вроде «Определение того, какое подвью в игровой доске было нажато». Спрашивая, «какой экземпляр« я », на первый взгляд мало смысла. –

ответ

5

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

+0

Он уже сказал, что он подклассифицировал NSView ... Тем не менее, установка тега, вероятно, очень простой способ узнать, какой вид клика был нажат. Для этого требуется вручную назначить тег для каждого представления в нужном порядке, но это похоже на очень эффективное решение. +1 –

0

Я думаю, hitTest: сделаю то, что вы хотите. Что-то вроде этого:

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

NSView наследует от NSResponder, поэтому вам, вероятно, не придется вручную проверять это - документация для -hitTest: говорит: «Этот метод используется главным образом объектом NSWindow, чтобы определить, какое представление должно получить событие мыши. 'd редко нужно ссылаться на этот метод, но вы можете переопределить его, чтобы объект просмотра скрывал события mouse-down из своих подзонов. " Если в NSView вызывается метод -mouseDown:, это означает, что было определено, что представление соответствует тому, которое должно отвечать на событие. –

1

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

Если вы справляетесь MouseDown в представлении плитки, то вам необходимо сопоставить себя с черепичной ID. Существует три простых способа:

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

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

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

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