【问题标题】:NSView doesn’t catch keyDown eventsNSView 不捕获 keyDown 事件
【发布时间】:2015-02-15 19:10:10
【问题描述】:

我需要在 NSViewController 的子类中捕获 mouseDown 和 keyDown 事件,因为这是不可能的(如果我错了,请纠正我)我将我的 GameViewController 类留空,并将它的所有方法放到一个新的 GameView 类中。在 GameViewController.xib 的身份检查器中,我将我的类设置为 GameView,而 File's Owner 设置为 GameViewController。毕竟,我的 mouseDown 方法有效,但 keyDown 无效。 我试过这个:

- (BOOL) acceptsFirstResponder {
    return YES;
}

但它没有帮助。

请告诉我该怎么做。

UPD:实际上 keyDown 方法有效,但首先我需要单击窗口空白处的某个位置,然后一切才能按计划进行。再次,mouseDown 事件被触发,没有问题。我可能做错了什么?

【问题讨论】:

    标签: objective-c events nsview keydown nsviewcontroller


    【解决方案1】:

    您的视图在提供时接受第一响应者,但在您单击之前没有任何尝试使其成为第一响应者。

    在显示之前设置窗口的initialFirstResponder。如果您使用的是 NIB,则可以在此处进行设置。或者您可以通过编程方式进行。

    窗口显示后,您可以调用[window makeFirstResponder:view] 使视图成为其窗口的第一响应者。

    【讨论】:

    • 请告诉我应该把这个调用放在哪里,我没有 NSWindow 的任何文件。我尝试将 [self.view.window makeFirstResponder: gameView] 放在 gameViewController 的 viewDidLoad 中,但是似乎也不起作用。
    • 如果视图是与窗口分开创建的,因为它是由视图控制器加载的,所以在将视图添加到窗口之前,您不能使其成为第一响应者。您何时将视图控制器的视图添加到窗口以及如何添加?将视图添加到窗口后,您必须设置 initialFirstResponder 或调用 -makeFirstResponder:。
    • 我使用 NSTabView 对象来切换我的视图(这就是我需要 NSViewController 子类的原因),它被放置在 MainMenu.xib 中。这不是说我的观点不知何故被卡在了窗口上吗?
    • 好吧,有了这么多的抽象和自动化,很难知道视图何时添加到窗口中。您可以使用自定义视图类并覆盖-viewDidMoveToWindow。您可以实现选项卡视图委托并实现-tabView:didSelectTabViewItem:。如果您以编程方式设置选项卡视图的选定选项卡,则可以在切换到游戏视图的选项卡后立即调用-makeFirstResponder:。
    • 我取得了一些进展,但采用了不同的方法。除了带有自定义视图的窗口外,我在 MainMenu.xib 中有 gameView 和 menuView。当我单击一个按钮时,我会调用[[self.window.contentView animator] replaceSubview:self with:(NSView *)gameView]; 和[self.window makeFirstResponder: (NSView *)gameView];,反向类似。它有效!是的,在这里我可以毫无问题地使用我的键盘。不幸的是,当我第二次切换回 menuView 并转到 gameView 时,键盘又坏了。以这种方式改变观点有什么神秘之处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多