问题标签 [responder-chain]
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 - mouseDragged:是不是传下来了两个子视图?
我正在编写一个程序,该程序具有许多子类 NSView(Frame),它们具有不同的内容,可以通过鼠标在其父视图中拖动。所有视图都包含一个名为 contentView 的子视图,该子视图又可以包含更复杂的层次结构。
如果我有一个不可编辑的 NSTextField 作为 contentView,则 mouseDown: 和 mouseDragged: 事件将毫无问题地传递到其超级视图,并且拖动工作正常。
如果 contentView 是 NSView 的子类,而该子类又包含许多 NSTextField,则 mouseDragged: 事件不会从 NSTextField 传递到父视图。
mouseDown: 事件被框架接收。单击 NSTextFields 之间的间隙并直接拖动 contentView 效果很好。
NSTextFields 在 contentView 中是这样设置的:
我尝试将 mouseDragged: 方法添加到子类 NSTextField 和子类 NSView 中,并且不使用该方法。两者都没有改变。处于同一子视图级别的其他 NSControl 也存在此问题。
或者
目前,这种行为对我来说似乎完全不直观。有什么我想念的吗?(我在 Mountain Lion 上使用 Xcode 4.6.2。)
ios - iOS:nextResponder 可以是另一个应用程序吗?
这个问题与我之前的问题相关(受启发): iOS:处理远程控制事件,然后将事件中继到音乐应用程序
我的应用程序可以成为远程控制事件的第一响应者。但是,我希望我的应用程序将远程控制事件中继到其他应用程序。所以我的问题是是否可以将 nextResponder 设置为另一个应用程序中的对象?来自Apple doc: http: //developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html ,在我看来,响应者链是应用程序绑定的,没有提及在应用程序之间中继事件。
这甚至可能吗?
ios - UIControl 目标操作事件未沿响应者链向上流动
我有一个UIButton
内部 a UITableViewCell
,它保存在我的UITableViewController
子类拥有的表中。我正在尝试利用目标/动作对的功能,它可以将事件冒泡到下一个响应者,直到找到可以处理事件的响应者,但我没有让它工作。一些代码:
在我的表格单元格中,我像这样设置我的按钮:
该按钮被添加到我的单元格中,并且该单元格在表格视图中显示得很好。由于我已经传递nil
了目标,所以这个事件应该冒泡,直到它到达我的View Controller,它实现-doThing
了,但它没有被调用。
我已经在单元子类和我的视图控制器子类中覆盖- (BOOL)canBecomeFirstResponder
并返回YES
,但即使结合起来,它仍然不起作用。
我已经调试看到按钮和视图控制器都在同一个响应者链中,但不知何故,事件似乎并没有弥补。
有任何想法吗?
objective-c - 从子类中移除一个动作
我的 NSDocument 子类实现了 selectAll:。唯一的问题是,我使用的是 NSTableView,它还实现了 selectAll:。但是, NSTableView 中的 selectAll: 操作并没有做我想要的,它确实阻止了我的 Document 类中的 selectAll: 方法在响应者链中被访问。
我已经有一个 NSTableView 的子类,经过一番探索后,我通过向我的 NSTableView 子类添加了一个 respondsToSelector: 方法,告诉它没有 selectAll: 操作,从而使事情按我想要的方式工作:
这似乎工作正常,允许我的文档子类中的 selectAll: 方法来做它的事情。但是这个解决方案让我有点不安。我在这个子类中实现的其他操作方法呢?我是否需要手动检查并为它们中的每一个返回 true?我确实在这个子类中定义了两个动作,moveLeft: 和 moveRight:,它们似乎工作,即使我没有在 respondsToSelector: 中处理它们。所以我的问题是,我这样做是否正确,还是我缺少什么?或者也许有一些完全不同的方法可以正确地做到这一点?
顺便说一句,我从 OmniGroup 论坛上的这篇文章中得到了覆盖 respondsToSelector 的想法:
http://mac-os-x.10953.n7.nabble.com/Removing-an-action-from-a-subclass-td27045.html
ios - UITableViewCell 在响应者链中跳过
我试图在 a 的子视图中触发事件UITableViewCell
,并让它在响应者链中冒泡并由自定义UITableViewCell
子类处理。
基本上:
SomeView.m(这是 的子视图UITableViewCell
)
SomeCustomCell.m
为了测试为什么这不起作用,我someAction:
在 ViewController 上添加了方法,而 ViewController 是最终处理从表格视图单元子视图冒泡的事件的方法,即使 Cell 应该处理它。someAction:
我已经检查了 Cell 是否在响应者链上,并且我已经验证了响应者链上的任何视图,无论是在单元上方还是下方,如果它们实现了该方法,它们都会响应事件。
这到底是怎么回事?
这是一个显示它的项目https://github.com/keithnorm/ResponderChainTest这是某种预期的行为吗?我没有找到任何说明 UITableViewCell 的处理方式与其他 UIResponder 不同的文档。
nsdocument - NSDocument 不在响应者链中
根据文档(参见图 1.10),NSDocument
应该在响应者链中。
但是,如果我尝试通过该方法记录响应者链
这是我得到的:
2014-04-16 13:04:16.228 MyApp [5430:303] < NSWindow: 0x6080001e3200>
2014-04-16 13:04:16.228 MyApp [5430:303] < NSWindowController: 0x608000085dc0>
为什么会这样?我错过了什么吗?
我遇到这个问题的应用程序是一个最小的基于文档的应用程序:除了日志记录方法之外什么都没有。
delegates - 将委托添加到响应者链停止滚动工作
出于多种原因,我将实现 NSOutlineViewDelegate 协议的类添加到响应者链中:
这会阻止我的大纲视图滚动。拨打电话 - 滚动工作正常,将其放回 - 滚动停止。如果我使用向上和向下箭头在视图中移动选择,它会滚动以显示选定的行,但手势滚动不会做任何事情。
委托包含很多支持拖放的方法,以及支持上下文菜单的 ibaction 方法,但我想不出里面有什么会干扰滚动(我使用的是带有手势滚动的 macbook air)。有人知道是什么导致了干扰吗?或任何想法如何诊断?
我应该补充一点,我将委托类设为 NSResponder 的子类。
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:
当前文档的内容,但我正在寻找正确的方法。
提前谢谢了!
ios - 从 UIPopoverController 中解开 Segue
我已经通过发送它UIViewController
从 a 加载了它(它不是我的应用程序的主要故事板)。UIStoryboard
initialViewController
我在那个故事板中使用了一个放松的转场。它的退出点是在主要UIViewController
场景中的一个放松动作中。 UIStoryboard
我用代码而不是 segue 显示这个视图控制器。
如果我用 显示加载的视图控制器presentViewController:animated:completion:
,则展开 segue 可以正常工作并找到合适的处理程序。
但是,如果我将呈现的视图控制器包装在 a中,然后呈现弹出框,则展开 segue 不起作用。UIPopoverController
我可以断点展开动作并且它不会被调用。
在他们关于 unwind segues 如何工作的技术说明中,Apple 介绍了查找目标视图控制器的过程。
Unwind Segue 如何确定其目标视图控制器 当启动 unwind segue 时,它必须首先在导航层次结构中找到最近的视图控制器,该控制器实现在创建 unwind segue 时指定的展开操作。这个视图控制器成为展开转场的目的地。如果没有找到合适的视图控制器,则 unwind segue 被中止。
从启动 unwind segue 的视图控制器开始,搜索顺序如下:
响应者链中的下一个视图控制器被发送
viewControllerForUnwindSegueAction:fromViewController:withSender:
消息。对于模态呈现的视图控制器,这将是调用presentViewController:animated:completion:
. 否则,parentViewController
. 默认实现在接收者的childViewControllers
数组中搜索想要处理展开动作的视图控制器。如果接收者的子视图控制器都不想处理展开动作,则接收者检查它是否想要处理展开动作,如果是,则返回 self。在这两种情况下,该canPerformUnwindSegueAction:fromViewController:withSender:
方法都用于确定给定的视图控制器是否想要处理展开操作。
viewControllerForUnwindSegueAction:fromViewController:withSender:
如果在第一步中没有返回视图控制器,则从响应者链中的下一个视图控制器开始重复搜索。
(注意我对第二点的强调。)
所以,据我所知,我正在做的事情应该以某种方式工作。unwind segue 将在响应者链中冒泡,从呈现的视图控制器中UIPopoverController
出来,进入到出现的任何内容中,并在链上向上 - 最终找到我的 unwind 处理程序。
但它不起作用。有什么想法为什么不呢?