Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa -未调用[nsrresponder swipeWithEvent:]_Cocoa_Osx Lion_Swipe_Gestures - Fatal编程技术网

Cocoa -未调用[nsrresponder swipeWithEvent:]

Cocoa -未调用[nsrresponder swipeWithEvent:],cocoa,osx-lion,swipe,gestures,Cocoa,Osx Lion,Swipe,Gestures,我正在编写一个针对OSX Lion和SnowLeopard的应用程序。我有一个视图,我想对刷卡事件做出响应。我的理解是,如果在我的自定义视图中实现了该方法,则三个手指滑动将调用-[NSResponder swipeWithEvent:。我已经查看了问题和相应的答案,并尝试了Oscar Del Ben代码的以下修改存根实现: @implementation TestView - (id)initWithFrame:(NSRect)frame { self = [super initWit

我正在编写一个针对OSX Lion和SnowLeopard的应用程序。我有一个视图,我想对刷卡事件做出响应。我的理解是,如果在我的自定义视图中实现了该方法,则三个手指滑动将调用
-[NSResponder swipeWithEvent:
。我已经查看了问题和相应的答案,并尝试了Oscar Del Ben代码的以下修改存根实现:

@implementation TestView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor redColor] set];
    NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}

- (void)swipeWithEvent:(NSEvent *)event {
    NSLog(@"Swipe event detected!");
}

- (void)beginGestureWithEvent:(NSEvent *)event {
    NSLog(@"Gesture detected!");
}

- (void)endGestureWithEvent:(NSEvent *)event {
    NSLog(@"Gesture end detected!");
}

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"mouseDown event detected!");
}

@end

这可以很好地编译和运行,并且视图按预期呈现。已正确注册
mouseDown:
事件。但是,不会触发任何其他事件。无论是
begin/endGestureWithEvent:
方法,还是
swipeWithEvent:
方法。这让我想知道:我是否需要在某个地方设置项目/应用程序设置,以正确接收和/或解释手势?提前感谢您的帮助。

您的观点是否接受第一响应者

- (BOOL) acceptsFirstResponder
{
  return YES;
}

不确定是不是问题,但只有按键窗口接收手势。是您的窗口键吗?

要接收swipeWithEvent:消息,您必须确保三指滑动手势未映射到任何可能导致冲突的内容。转到系统首选项->轨迹板->更多手势,然后将这些首选项设置为以下选项之一:

  • 在页面之间滑动:

  • 用两个或三个手指滑动,或
  • 用三个手指刷卡

  • 在全屏应用程序之间滑动:

  • 用四个手指向左或向右滑动
具体来说,全屏应用之间的滑动不应设置为三个手指,否则您将不会收到swipeWithEvent:消息

这两个首选项设置一起导致将swipeWithEvent:消息发送给第一响应者

当然,您仍然需要实现实际的刷卡逻辑。如果你想在iOS上执行流体滚动滑动,那么你需要做更多的工作。在Lion App Kit发行说明中的“流体滑动跟踪”一节中有一个示例说明了如何执行此操作


请参见尝试
[自我设置接受接触事件:是]此处显示的是
//初始化代码。

作为旁注,可以从
-[NSResponder scrollWheel:///code>获取滚动手势,但我想特别使用三指手势。我假设您的意思是
-(BOOL)acceptsFirstResponder
;我没有,但我只是用它试了试,结果不起作用。是的,我编辑了答案。你确定你的手指在视线上方滑动吗?是的;我实现了响应滚动手势的其他功能,它可以按预期工作,正如
mouseUp:
回调一样;它是应用程序中唯一的窗口,接收滚动事件。有什么东西可能会使它不是关键的,除了我主动不设置它是关键的?非关键窗口仍然收到滚轮事件(这就是为什么你可以用两个手指拖动背景窗口。)我检查;这是钥匙。我会看看我是否可以创建一个小项目来重现这种行为(这目前正在一个中等规模的应用程序中发生);我想当有人回复时,他会给我发电子邮件。我使用BetterTouchTool,所以很可能这就是事情没有像我希望的那样工作的原因。我来看看,;同时,我认为这个答案提供了必要的信息,所以我把它标记为正确的;或者简单地覆盖acceptsTouchEvents,为您的视图返回YES。