2009-06-25 32 views
1

我有一個包含25個tile的myGameTile(NSView的子類)的遊戲板。 在mouseDown中:我想確定我點擊了哪個圖塊並將一個ivar設置爲具有代表性的值。確定哪個NSView實例啓動了mouseDown:

例如如果我點擊圖塊12,將clickedTile設置爲「12」或某個唯一表示該特定實例的值。

我打開任何從整數值12一直到某種內省/反射,雖然內置功能和優雅比黑客,運行時包裝和修改更可取。不過,我知道我可能別無選擇,只能依靠這些解決方案,所以請回答這些問題。我想知道我所有的選擇。謝謝!

+0

這是一個題目很差的問題。我建議將其改爲「確定單擊某個遊戲板中的哪個子視圖」。乍一看,「自己是哪個實例」毫無意義。 – 2009-06-26 06:24:07

回答

5

您可以繼承NSView並覆蓋tag method,如文檔中所述。

+0

他已經表示他已經劃分了NSView ...也就是說,設置標記可能是一種非常簡單的方法來知道哪個視圖被點擊。這需要手動爲每個視圖分配一個標籤,但這似乎是一個非常可行的解決方案。 +1 – 2009-06-26 06:26:52

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很少需要調用這個方法,但是你可能想要覆蓋它來讓一個視圖對象隱藏它的子視圖中的鼠標按下事件。「如果在NSView上調用-mouseDown:方法,則意味着視圖被確定爲應該響應該事件的視圖。 – 2009-06-26 06:29:24

1

您有幾種可能性:

如果處理MouseDown在瓷磚觀點,那麼你需要自我映射到區塊ID。有三種簡單的方法可以做到這一點:

  • 預先將Tile.tag配置爲tile ID,然後使用self.tag。
  • 搜索瓷磚的陣列查找索引磁磚[parent.tiles indexOfObject:自]
  • 創建字典映射磁磚或瓷磚ID [[parent.tiles objectForKey:自]的intValue]

很明顯,使用標籤是最簡單的,只要你不用其他標籤。

或者,您可以在父視圖中實現hitTest,並返回父視圖,然後在父視圖中處理mouseDown。然後mouseDown會知道命中的地方,因此它是哪個磁盤。