问题标签 [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.
objective-c - 为什么不调用 NSResponder 的键盘操作?
NSResponder 定义了许多与键盘操作相关的操作moveUp:
,例如moveUpAndModifySelection:
和moveToBeginningOfLine:
。除了按修饰键(例如moveUp:
只是Up
箭头键)未触发的操作外,我无法在我的 custom 上调用任何操作NSView
。
这是设置:
- Xcode 5.1 / 10.9
- 基本的 Cocoa 应用程序,仅
Custom View
添加到主窗口。 - 这个自定义视图只是一个
NSView
类STView
STView
无非是覆盖acceptsFirstResponder
返回YES
在此设置中,我的STView
实例将正确接收所有键盘事件(包括具有修饰符的事件Ctl-A
,performKeyEquivalent:
如keyDown:
预期的那样。(这两种方法都已在下面的讨论中注释掉。)
如果我提供了一个实现,那么当用户按下箭头键时会正确调用thenmoveUp:
中定义的。NSResponder
moveUp:
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:
在他们的自定义类上得到一条消息?NSView
Shift-Up
作为参考,我将此图表用于键盘绑定,但坦率地说,我已经尝试了几乎所有组合,无论是否列出:
归根结底,我可能只是重写keyDown:
并手动处理我感兴趣的所有组合,但我希望至少能理解为什么这对我来说不起作用。
(请注意,此处的预期应用程序是允许用户导航项目的类似网格的视图,很像集合视图。)
任何提示、建议或意见将不胜感激。
更新:
如果您在您的keyDown
然后将在您的自定义视图上调用“正确”操作。我认为这是因为我感兴趣的动作是类似文本的动作,它需要输入管理器解释并转换为适当的动作。
我仍然不完全清楚为什么moveUp:
正确地被调用。响应者链中的谁在识别Up
被按下的箭头键然后发送moveUp:
消息?
c++ - 如果不是第一响应者,为什么我可以单击 NSButton?
我正在尝试在 C++ 中实现一个类NSResponder
,但我不明白的是:
所有键盘/鼠标交互都发送给第一响应者,因此,例如,如果 NSTextField 当前是第一响应者,NSButton
同一视图中的另一个如何知道它已被点击?如果文本字段不希望鼠标单击,它将把它发送到它的超级视图,它的超级视图将它发送到视图控制器。所以鼠标点击事件永远不会到达按钮。
这可能很明显,但我现在无法理解它。
cocoa - 在基于 NSDocument 的应用程序中拦截 Cmd-Key 的最佳位置
在基于应用程序中拦截CmdAnyKey关键事件的最合适位置是什么?NSDocument
意图是切换到活动窗口中的某个组件——有点像 Firefox 允许您切换选项卡——而在菜单命令上没有匹配的快捷方式来执行该任务。
即,理想情况下,框架应该进行正常处理,包括处理菜单命令,并且在所有其他响应者未能响应该特定快捷方式之后,它应该被路由到自定义方法。
我已经搜索NSDocument
, NSAppDelegate
,NSWindowController
但找不到任何适当的机制来挂钩以便在窗口级别接收这些命令。
因此,缺乏任何现有的自定义机制是否会keyDown:
在自定义中覆盖NSWindowController
看起来像是达到预期效果的最合适的方式?
cocoa - NSResponder 方法只调用 setNeedsDisplay
我有一个 openGl 视图的子类。在其中一种方法中,我设置了一个标志来绘制黑色或白色背景。在方法结束时,我调用 setNeedsDisplay。这永远不会被调用!我在 mouseDownEvent 中也有一个 setNeedsDisplay。当我单击视图时,它会调用它!我的背景改变了颜色。有任何想法吗?这是代码。
在 openGL 视图中
在应用程序委托中
cocoa - 在无标题窗口中禁用所有控件
在我的应用程序中,我的方法中有一个NSWindow
从 .xib 创建的辅助文件。该窗口是一个普通的窗口,标题栏已关闭。NSWindowController
initWithWindowNibName:
NSWindow
创建窗口后,它使用makeKeyAndOrderFront:
-显示,
并且所有控件都被禁用(文本字段、组合框)。
我已经(超过..)三次检查了窗口中的所有标志和控件的视图层次结构:一切都已启用,允许编辑而不是拒绝成为第一响应者。
完全无知。有任何想法吗?
更新#1:
我似乎问题与没有标题栏的窗口有关。当标题栏打开窗口时 - 并且窗口中的控件 - 按预期运行。
objective-c - 如何更改 IKImageBrowserView 的双击行为?
我IKImageBrowserView
在仅 Mac 10.9 的应用程序中使用 a 。
当我双击项目中的项目时,IKImageBrowserView
该项目在预览中打开。
我想更改此行为并打开我自己的应用程序的窗口,其中包含有关双击项目的详细信息。
我怎样才能简单地禁用IKImageBrowserView
的双击行为?
添加我自己的双击行为的最佳方法是什么?
macos - NSViewController 上的 validateMenuItem
是否可以让 validateMenuItem 与 NSViewControllers 一起使用?文档说 NSViewController 是 NSResponder 的子类,所以我认为它会参与响应者链,但我一直无法让它工作。我可以让它与 NSView 一起工作,没问题。
我的特定用例是 MainMenu.xib 中的一个菜单项,连接到 First Responder。我的视图控制器子类中的选择器显示在 MainMenu 中的 First Responder 弹出选择器列表中,所以我认为它会起作用,但它没有。我的子类的 validateMenuItem 方法永远不会被调用。(应用程序委托中的那个被调用,但不是为连接到 First Responder 的项目。)
cocoa - NSButton:设置不同的对焦环颜色
我正在尝试将 NSButton 焦点环颜色设置为白色。目前,当按钮有 firstResponder 时,它显示一个蓝色轮廓。
我知道有drawFocusRingMaskWithFrame:inView:来帮助做到这一点,但我不知道如何使用它来将颜色更改为白色。我还没有看到使用此 API 的任何工作示例。
谢谢。
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: 方法,这样不会失去焦点?
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:
当前文档的内容,但我正在寻找正确的方法。
提前谢谢了!