2009-02-02 15 views
0

起初,我有一個窗口與我的自定義控件。爲了得到它,接受鼠標移動我只是把它的awakeFromNib事件:在一個窗口中使用mouseMoved的多個自定義控件

代碼:

[自我窗口] makeFirstResponder:自我]。 [[self window] setAcceptsMouseMovedEvents:YES];

現在我在做與他們四個在同一個窗口的東西,這不工作這麼漂亮了。首先,我把它們從控制器的awakeFromNib中取出,並決定使用我的appController來管理它,即[window makeFirstResponder:View]

我的問題是,如果我在同一視圖中如何管理其中的四個希望每個人都響應鼠標移動的事件?現在,我告訴窗口響應mouseMoved事件,但沒有任何視圖響應mouseMoved。

回答

1

您還需要重寫-acceptsFirstResponder返回YES。

 
    #pragma mark NSResponder Overrides 
    - (BOOL)acceptsFirstResponder 
    { 
    return YES; 
    } 

-mouseMoved事件是昂貴的,所以我關掉鼠標移動事件被稱爲我的控制的-mouseExited消息時,我把它放在-mouseEntered。

 
    - (void)mouseEntered:(NSEvent *)theEvent 
{ 
    [[self window] setAcceptsMouseMovedEvents:YES]; 
    [[self window] makeFirstResponder:self]; 
} 

- (void)mouseMoved:(NSEvent *)theEvent 
{ 
... 
} 

- (void)mouseExited:(NSEvent *)theEvent 
{ 
    [[self window] setAcceptsMouseMovedEvents:NO]; 
} 

我很快在我的自定義控件應用程序中測試了這個。我在nib文件中多次複製控件,並且按預期工作。

您可能還需要:

- (void)awakeFromNib 
{ 
    [[self window] setAcceptsMouseMovedEvents:YES]; 
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES]; 
} 

我不認爲-setAcceptsMouseMovedEvents是必要的,但我敢肯定的跟蹤RECT代碼。您可能還需要嘗試使用assumeInside:參數的值,但這是記錄的。

+0

我加的mouseEntered:和的mouseExited:如上述實施它們,但它不調用方法(的NSLog內未顯示)。此外,什麼是#pragma標記NSResponder覆蓋意味着 – cemulate 2009-02-03 02:27:12

相關問題