2012-08-10 67 views
2

我有一個的NSView與它QTMovieView。我的QTMovieView僅用於顯示電影;我不希望用戶能夠以任何方式與它進行交互。在對如何禁用拖動QTMovieView的令人失望的搜索之後,我遇到了這種解決方法,我在QTMovieView上實現了一個類別。它的目的是覆蓋QTMovieView的鼠標事件,併成功地防止用戶能夠拖動或點擊QTMovieView暫停播放:QTMovieView單擊並拖動打亂鍵盤事件

//QTMovieView+TFOverrideDrag.h 

#import <QTKit/QTKit.h> 

@interface QTMovieView (TFOverrideDrag) 

- (void)mouseDown:(NSEvent *)theEvent; 
- (void)mouseDragged:(NSEvent *)theEvent; 
- (void)rightMouseDown:(NSEvent *)theEvent; 

@end 

...

//QTMovieView+TFOverrideDrag.m 

#import "QTMovieView+TFOverrideDrag.h" 

@implementation QTMovieView (TFOverrideDrag) 

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"MDown"); 
} 

- (void)mouseDragged:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"MDrag"); 
} 

- (void)rightMouseDown:(NSEvent *)theEvent 
{ 
    [self.superview becomeFirstResponder]; 
    NSLog(@"RMouse"); 
} 
@end 

這可以有效地防止用戶拖動或暫停電影,並且NSLog語句被正確調用。

的問題是,點擊QTMovieView之後,QTMovieView的上海華停止響應鍵盤事件(的keyDown)。這就是爲什麼我將[self.superview becomeFirstResponder];行包含在每個QTMovieView的重寫類中的方法。這並沒有解決問題。

值得一提的是,QTMovieView的上海華比QTMovieView,其中一些在QTMovieView的頂部被吸引其他子視圖。點擊時,QTMovieView不會引起任何問題,並且程序繼續正常運行。但是,在這種情況下仍然會調用NSLog語句。

我相信,這確實是導致該問題,因爲我已經取出後運行程序QTMovieView,並在該地區的所有點擊不會造成問題。

我的問題歸結爲以下:有沒有人有一個更合理的解決方法不是覆蓋了QTMovieView鼠標事件,以防止用戶交互?如果沒有,有誰知道爲什麼QTMovieView框架內的點擊會導致其超級視圖停止響應鍵盤?或者,如果有一個不同於QTMovieView的類可以使用,我會開放的,儘管我需要利用QTMovieLoopsAttribute,所以任何其他類都需要提供該功能。

回答

0

經過一番進一步的考慮,我找到了一個解決方案。我需要重寫我的類別多了一個QTMovieView方法:

- (void)keyDown:(NSEvent *)theEvent 
{ 
    [self.nextResponder keyDown:theEvent]; 
    NSLog(@"keyDown"); 
} 

日誌聲明不會調用的keyDown事件直到我點擊了QTMovieView的框架。一旦我做到了(這是我的keyDown事件以前開始被superview忽略),日誌語句被調用。但是,現在我將keyDown事件傳遞給nextResponder,超級視圖正確響應。我仍然對這種令人費解的解決方法的需求感到惱火,所以如果任何人有更優雅的東西,請分享!在此之前,我希望這可以幫助其他人解決類似的問題!