问题标签 [nsresponder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2706 浏览

objective-c - 为什么不调用 NSResponder 的键盘操作?

NSResponder 定义了许多与键盘操作相关的操作moveUp:,例如moveUpAndModifySelection:moveToBeginningOfLine:。除了按修饰键(例如moveUp:只是Up箭头键)未触发的操作外,我无法在我的 custom 上调用任何操作NSView

这是设置:

  • Xcode 5.1 / 10.9
  • 基本的 Cocoa 应用程序,仅Custom View添加到主窗口。
  • 这个自定义视图只是一个NSViewSTView
  • STView无非是覆盖acceptsFirstResponder返回YES

在此设置中,我的STView实例将正确接收所有键盘事件(包括具有修饰符的事件Ctl-AperformKeyEquivalent:keyDown:预期的那样。(这两种方法都已在下面的讨论中注释掉。)

如果我提供了一个实现,那么当用户按下箭头键时会正确调用thenmoveUp:中定义的。NSRespondermoveUp:Up

令人困惑的moveUp:是,只要Up使用修饰键按下箭头键,也会调用它。当按住修饰键时(例如:)Ctl-Up,我希望调用适当的键盘操作方法。

前任:

  • Ctl-Up-> moveUp:(预期scrollPageUp::)
  • Alt-Up-> moveUp:(预期moveToBeginningOfParagraph::)
  • Shift-Up-> moveUp:(预期moveUpAndModifySelection::)
  • Command-Up-> moveUp:(预期moveToBeginningOfDocument::)

对于所有键/修饰符组合,此模式会重复。

Apple 文档中的两个方面似乎相关:

通读该文档,系统似乎负责将关键事件映射到相应的关键操作。事实上,当没有按下修饰键时,这对我有用。但是当按下修饰键时,事件就像任何其他事件一样被处理并通过正常的响应者链传递。

(我可以看到修饰键事件通过NSApplication sendEvent,尽管NSApplication sendAction:to:from:从未被调用,并继续沿视图层次结构向下移动,鉴于我阅读了上面的文档,我希望这一点。

文档提示文本编辑视图可能会被区别对待。这些键盘操作是否仅发送到编辑文本的视图?如果没有,那么当用户按下时,如何moveUpAndModifySelection:在他们的自定义类上得到一条消息?NSViewShift-Up

作为参考,我将此图表用于键盘绑定,但坦率地说,我已经尝试了几乎所有组合,无论是否列出:

归根结底,我可能只是重写keyDown:并手动处理我感兴趣的所有组合,但我希望至少能理解为什么这对我来说不起作用。

(请注意,此处的预期应用程序是允许用户导航项目的类似网格的视图,很像集合视图。)

任何提示、建议或意见将不胜感激。

更新:

如果您在您的keyDown

然后将在您的自定义视图上调用“正确”操作。我认为这是因为我感兴趣的动作是类似文本的动作,它需要输入管理器解释并转换为适当的动作。

我仍然不完全清楚为什么moveUp:正确地被调用。响应者链中的谁在识别Up被按下的箭头键然后发送moveUp:消息?

0 投票
1 回答
597 浏览

c++ - 如果不是第一响应者,为什么我可以单击 NSButton?

我正在尝试在 C++ 中实现一个类NSResponder,但我不明白的是:

所有键盘/鼠标交互都发送给第一响应者,因此,例如,如果 NSTextField 当前是第一响应者,NSButton同一视图中的另一个如何知道它已被点击?如果文本字段不希望鼠标单击,它将把它发送到它的超级视图,它的超级视图将它发送到视图控制器。所以鼠标点击事件永远不会到达按钮。

这可能很明显,但我现在无法理解它。

0 投票
1 回答
240 浏览

cocoa - 在基于 NSDocument 的应用程序中拦截 Cmd-Key 的最佳位置

在基于应用程序中拦截CmdAnyKey关键事件的最合适位置是什么?NSDocument

意图是切换到活动窗口中的某个组件——有点像 Firefox 允许您切换选项卡——而在菜单命令上没有匹配的快捷方式来执行该任务。

即,理想情况下,框架应该进行正常处理,包括处理菜单命令,并且在所有其他响应者未能响应该特定快捷方式之后,它应该被路由到自定义方法。

我已经搜索NSDocument, NSAppDelegateNSWindowController但找不到任何适当的机制来挂钩以便在窗口级别接收这些命令。

因此,缺乏任何现有的自定义机制是否会keyDown:在自定义中覆盖NSWindowController看起来像是达到预期效果的最合适的方式?

0 投票
0 回答
55 浏览

cocoa - NSResponder 方法只调用 setNeedsDisplay

我有一个 openGl 视图的子类。在其中一种方法中,我设置了一个标志来绘制黑色或白色背景。在方法结束时,我调用 setNeedsDisplay。这永远不会被调用!我在 mouseDownEvent 中也有一个 setNeedsDisplay。当我单击视图时,它会调用它!我的背景改变了颜色。有任何想法吗?这是代码。

在 openGL 视图中

在应用程序委托中

0 投票
1 回答
463 浏览

cocoa - 在无标题窗口中禁用所有控件

在我的应用程序中,我的方法中有一个NSWindow从 .xib 创建的辅助文件。该窗口是一个普通的窗口,标题栏已关闭。NSWindowControllerinitWithWindowNibName:NSWindow

创建窗口后,它使用makeKeyAndOrderFront:-显示,
并且所有控件都被禁用(文本字段、组合框)。

我已经(超过..)三次检查了窗口中的所有标志和控件的视图层次结构:一切都已启用,允许编辑而不是拒绝成为第一响应者。

完全无知。有任何想法吗?

更新#1:
我似乎问题与没有标题栏的窗口有关。当标题栏打开窗口时 - 并且窗口中的控件 - 按预期运行。

0 投票
1 回答
227 浏览

objective-c - 如何更改 IKImageBrowserView 的双击行为?

IKImageBrowserView在仅 Mac 10.9 的应用程序中使用 a 。

当我双击项目中的项目时,IKImageBrowserView该项目在预览中打开。

我想更改此行为并打开我自己的应用程序的窗口,其中包含有关双击项目的详细信息。

我怎样才能简单地禁用IKImageBrowserView的双击行为?
添加我自己的双击行为的最佳方法是什么?

0 投票
0 回答
633 浏览

macos - NSViewController 上的 validateMenuItem

是否可以让 validateMenuItem 与 NSViewControllers 一起使用?文档说 NSViewController 是 NSResponder 的子类,所以我认为它会参与响应者链,但我一直无法让它工作。我可以让它与 NSView 一起工作,没问题。

我的特定用例是 MainMenu.xib 中的一个菜单项,连接到 First Responder。我的视图控制器子类中的选择器显示在 MainMenu 中的 First Responder 弹出选择器列表中,所以我认为它会起作用,但它没有。我的子类的 validateMenuItem 方法永远不会被调用。(应用程序委托中的那个被调用,但不是为连接到 First Responder 的项目。)

0 投票
1 回答
722 浏览

cocoa - NSButton:设置不同的对焦环颜色

我正在尝试将 NSButton 焦点环颜色设置为白色。目前,当按钮有 firstResponder 时,它显示一个蓝色轮廓。

我知道有drawFocusRingMaskWithFrame:inView:来帮助做到这一点,但我不知道如何使用它来将颜色更改为白色。我还没有看到使用此 API 的任何工作示例。

谢谢。

0 投票
2 回答
579 浏览

cocoa - 启用 NSArrayController“自动重新排列内容”时,插入和编辑新对象后键盘焦点丢失

我只有一个主从类型的应用程序 OS X 10.9:
窗口左侧的 NSTableView,右侧的详细信息为 NSTextFields。
我没有专门设置标签顺序,开箱即用就可以了。

插入新对象后除外:

  • 插入新对象后,该对象在 NSTableView 中被选中。
  • 点击标签
  • 第一个 NSTextField 被选中
  • 写点东西,点击标签
  • 现在没有选择下一个 NSTextField 而不是选择任何内容,
  • 点击标签
  • NSTableView 被选中
  • 点击标签
  • 第一个 NSTextField 被选中

我想要的是:

  • 插入新对象后,应该选择detail部分的第一个NSTextField
  • 点击标签
  • 应该选择详细部分的下一个 NSTextField
  • …</li>

更新:我发现奇怪的行为是通过在 Interface Builder 中启用 NSArrayController 的“自动重新排列内容”来触发的。如果我禁用它,我不会再失去焦点。请参阅CoreData-bound NSTableView 在项目更改时失去输入焦点,但前提是排序

但是,当然,我仍然希望我的内容能够自动排序——只是在操作过程中不会失去我的注意力。这可以做到吗?

UPDATE2:当我的文本字段失去键盘焦点时,我遵循了@KenThomases 的建议并记录了堆栈跟踪:

所以也许我可以编写自己的 NSArrayController rerangeObjects: 方法,这样不会失去焦点?

0 投票
1 回答
1592 浏览

cocoa - Cocoa:将操作(复制:,粘贴:等)转发到响应者链

我有一个NSOutlineView实现copy:,paste:等的子类cut:。此外,NSDocument子类实现了这些相同的方法。

当大纲视图在响应者链中时(是第一响应者或它的父视图),所有的复制/粘贴事件都NSOutlineView被子类拦截。我想要的是根据上下文捕获其中一些消息,或者让它们传播并NSDocument被子类捕获。

我想要的基本上是:

我已经尝试了很多技巧,没有一个成功:

  • [[self nextResponder] copy:sender]这不起作用,因为下一个响应者可能无法实现copy:
  • [super copy:sender]同样在这里,超级没有实现copy:
  • [NSApp sendAction:anAction to:nil from:sender]很高兴向第一响应者发送操作。如果在动作中使用

当然,我可以在响应者链上手动循环,直到找到响应copy:甚至直接调用copy:当前文档的内容,但我正在寻找正确的方法。

提前谢谢了!