问题标签 [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.
cocoa - Cocoa NSApplication 未激活但接收鼠标事件
我有一个奇怪的问题,我点击远离我的窗口。它放弃了主要和关键。然后我点击回到它,点击的视图不响应鼠标点击。但是第二次单击确实会导致视图响应。好像在第一次单击期间,窗口不是键,单击导致它成为键并能够处理第二次单击。
我进行了子类化NSApplication
和拦截sendEvent:
,以查看我的应用程序是否在第一次单击事件期间获取了事件,并且确实如此。此外,我转储了响应者链,发现我的视图确实在链中,但直到第二次单击,窗口才成为关键。我还注意到,当我收到第一个点击事件时,应用程序甚至都没有处于活动状态。这怎么可能?应用程序在收到鼠标事件时不应该激活吗?鸡蛋...
有什么想法/建议吗?
更新:通读文档后,我发现:
当用户在光标位于视图对象上时按下鼠标按钮时,会发送鼠标按下事件。如果包含视图的窗口不是关键窗口,则该窗口成为关键窗口并丢弃鼠标按下事件。但是,视图可以通过覆盖 NSView 的acceptsFirstMouse: 方法以返回YES 来规避这种默认行为。
所以这似乎是正在发生的事情。acceptsFirstMouse:
但是,我尝试覆盖acceptsFirstResponder
但无济于事。我的观点仍然不是“接受第一只鼠标”。
谢谢!
cocoa - 是否有 NSResponder 委托之类的东西?
在我的应用程序菜单上的 Cocoa 应用程序中,有一个菜单项“删除”,它向delete:
第一响应者发送消息。现在,我将键盘焦点放在 a 上NSOutlineView
,在这种情况下,它是第一响应者。缺少子类化NSOutlineView
,有没有办法处理delete:
传递给它的消息?无论是协议NSOutlineViewDelegate
还是NSOutlineViewDataSource
协议似乎都没有为处理这些操作定义任何有趣的东西。
objective-c - Objective-C:在按下另一个键时检测“shift”按键
这是为了实现一个基于键盘的游戏控制器。左/右箭头使角色行走。shift+left/right 使角色运行。
这是我到目前为止使用的代码:
如果在按下箭头键之前按下 shift,这将正常工作。但是如果按下箭头键并且你需要加速,按下 shift 不会导致任何事情发生......
所以,我看到了这样的答案: https ://stackoverflow.com/a/420691/987818
但我不明白这个 NSResponder 在哪里使用。对于信息,我使用 Cocos2D(objc 游戏引擎)。
感谢任何线索:-) J。
objective-c - 查看解释键事件:但将不需要的事件传递到响应者链上?
我真的很希望我的自定义视图可以与-moveLeft:
, -deleteForward:
,-selectAll:
等一起使用,但我也想将我不关心的任何键传递到响应者链上。现在我要优先-keyDown:
调用 call [self interpretKeyEvents:[NSArray arrayWithObject:event]];
,但这似乎占用了所有关键事件,即使是我的视图没有响应的事件。
有什么方法可以将不需要的事件向上传递,但仍然响应-moveLeft:
等?或者我是否需要实施我自己的所有行动,-keyDown:
以便我知道我做了什么,没有回应什么?
cocoa - 在编辑基于单元格的表格视图时拦截撤消
我想在表格视图单元格的文本编辑会话期间拦截或禁用 Cmd-Z/Shift-Cmd-Z。
它是一个基于单元格的表格视图,具有一系列列,其值相互影响,因此填充某些列将自动填充其他列。当用户在编辑会话中间按下 Cmd-Z 时,撤消管理器可以更改当前正在编辑的属性,这会给用户带来混乱的结果。
这是一个例子:
第 1 步:用户在第二列输入“.030”:
第二步:用户按下tab,模型自动更新第三、四、五列:
第 3 步:用户按下 Ctrl-Z,模型撤消对第 2、3、4 和 5 列的更改,但编辑会话仍在进行中,因此旧值显示在第 3 列中:
第 4 步:不输入任何内容,用户按下取消编辑的选项卡,第三列中的值消失:
这里实际上没有发生任何“错误”,但这令人困惑。
当正在编辑其中一个单元格时,我只想拦截 Cmd-Z 和 Shift-Cmd-Z 并忽略它们。我认为我应该-keyDown:
在编辑期间优先考虑急救人员。但那是什么?表格视图根本没有得到那些关键事件,单元格也不是响应者。
cocoa - NSMenu 中的代表成员
据我了解,委托类是始终从类继承的NSResponder
类,并且delegate
仅适用于从 NSResponder
. NSMenu
直接继承自NSObject
,那么为什么我会deletgate
在 中 看到outlets
?还是我误解了您在界面生成器中按住 ctrl 单击某个对象后看到的选项?我明白了Outlets
,,, 这些Referencing outlets
是Received Actions
什么意思呢?如果这很重要,我正在使用 Xcode 4 (10.7.3)。
objective-c - 如何使 NSControl(例如 NSTokenField)忽略鼠标事件
具体来说,我想NSTokenField
忽略鼠标事件,因为我使用它NSTableCellView
只是为了以标记化的方式显示数据而不允许任何编辑。
设置令牌字段的enabled = NO
工作,除了它使令牌变灰并使其难以阅读文本。
设置标记字段editable = NO
非常接近我想要的——它可以防止编辑,同时保留标记字段的外观——除了当我将鼠标悬停在标记上时,它们会亮起。如果我能阻止这种情况,我会做生意的。
我怀疑我需要子类化一些东西并覆盖一些NSResponder
方法,但不太确定该怎么做。我尝试了子类化NSTokenField
和覆盖mouseEntered:
并且mouseMoved:
什么都不做,但这也不起作用。
objective-c - NSControl 子类不应该改变 firstResponder
我将标签栏视图实现为 NSControl 子类。
当我单击它时,AppKit 将尝试更新firstResponder
我的 NSWindow。因为我不希望 tabbar 成为firstResponder
(acceptsFirstResponder
返回NO
) NSWindow 本身将成为firstResponder
. 我的响应者链将由窗口及其控制器组成,并且不会将任何操作消息传递到选项卡栏下方的子视图(NSOutlineView)。当我单击标签栏时,我希望 NSOutlineView 继续接收操作消息和事件。
这样做的适当方法是什么?有没有办法阻止 NSView 尝试更改firstResponder
被点击的时间?
我考虑过将工具栏设置为 NSOutlineView,但Apple 不建议nextResponder
手动更改NSView。nextResponder
objective-c - 用键盘控制 NSSegmentedControl
我的 Cocoa 应用程序中有一个表单,其中包含我希望通过键盘控制的 NSSegmentedControl。然而,NSSegmentedControl 似乎很不愿意成为第一响应者。
将窗口的初始第一响应者设置为分段控件没有任何作用——当窗口第一次加载时,它将没有键盘焦点。如果我像这样手动设置第一响应者,它确实会获得焦点,但是:
[segmentedControl.window makeFirstResponder: segmentedControl];
如果表单的唯一部分是分段控件,那将可以正常工作。如果我添加另一个字段(例如,一个 NSTextField),并将分段控件的 nextResponder 设置为该字段,则分段控件将永远不会成为第一响应者。焦点将立即转到文本字段,按 Tab 键切换回分段控件不起作用。
我试过继承 NSSegmentedControl 并覆盖 AcceptFirstResponder、becomeFirstResponder 等,但无济于事。唯一有区别的是resignFirstResponder——如果我从那个方法返回NO,那么分段控件确实会保持焦点,但显然我不希望它一直保持焦点。
关于如何让控件表现得像普通响应者的任何想法?
macos - 如何找到第一个响应者辞职的对象(控制器或视图)?
当特定对象退出 FirstResponder 时,我想做一些清理活动。有什么方法可以检测对象是否已退出第一响应者状态。
我需要实施哪些方法才能知道这一点?对此有任何指示吗?
我已经通过了这个链接。但我并没有从中得到太多。