我有一个带有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的超级视图除了QTMovieView之外还具有子视图,其中有些子视图绘制在QTMovieView的顶部。单击这些按钮后,QTMovieView不会引起任何问题,并且程序可以继续正常运行。但是,在这种情况下仍会调用NSLog语句。

我确信确实是导致问题的QTMovieView,因为我在删除程序后运行了该程序,并且在该区域中的所有单击都不会造成问题。

我的问题归结为以下几点:除了为QTMovieView覆盖鼠标事件以防止用户交互之外,还有没有其他人可以采用更合理的解决方法?如果不是,是否有人知道为什么在QTMovieView框架内单击会导致其超级视图停止响应键盘?或者,如果除了QTMovieView之外还有其他可以使用的类,那么我愿意接受,尽管我确实需要利用QTMovieLoopsAttribute,所以任何其他类都需要提供该功能。

最佳答案

经过进一步考虑,我找到了解决方案。我需要重写类别中的另一个QTMovieView方法:

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


在单击QTMovieView的框架之前,keyDown事件不会调用log语句。一旦我做完(这是我的keyDown事件以前开始被超级视图忽略的时候),将调用log语句。但是,现在我将keyDown事件传递给nextResponder,超级视图正在适当地响应。我仍然对这种复杂的解决方法感到恼火,因此,如果有人有一些更优雅的方法,请分享!在此之前,我希望这可以帮助其他遇到类似问题的人!

07-24 09:20