我有一个带有QTMovieView的NSView。我的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)。这就是我在类别中的每个QTMovieView重写方法中包含[self.superview becomeFirstResponder];
行的原因。这并没有解决问题。
值得注意的是,QTMovieView的superview具有QTMovieView以外的子视图,其中一些是在QTMovieView之上绘制的。单击这些时,QTMovieView不会导致任何问题,程序继续正常运行。但是,在这种情况下仍然会调用NSLog语句。
我确信导致问题的确是QTMovieView,因为我在删除它之后运行了该程序,并且该区域中的所有点击都没有引起任何问题。
我的问题归结为:有没有人有更合理的解决方法而不是覆盖QTMovieView的鼠标事件以防止用户交互?如果没有,是否有人知道为什么QTMovieView框架内的点击会导致其超级视图停止响应键盘?或者,如果有一个不同于QTMovieView的类可以使用,我会对此持开放态度,尽管我确实需要利用QTMovieLoopsAttribute,因此任何其他类都需要提供该功能。
答案 0 :(得分:0)
经过进一步的考虑,我找到了解决方案。我需要在我的类别中覆盖另外一个QTMovieView方法:
- (void)keyDown:(NSEvent *)theEvent
{
[self.nextResponder keyDown:theEvent];
NSLog(@"keyDown");
}
在我单击QTMovieView的框架之前,不会为keyDown事件调用log语句。一旦我这样做(这是我的keyDown事件以前开始被superview忽略的时候),就会调用log语句。但是,现在我将keyDown事件传递给nextResponder,superview正在做出相应的响应。我仍然对这种复杂的解决方案的需要感到恼火,所以如果有人有更优雅的东西,请分享!在那之前,我希望这可以帮助其他人遇到类似的问题!