NSApp.sendAction()仅在一段时间后有效

时间:2018-03-15 09:13:51

标签: macos cocoa nssplitview responder-chain

我希望ViewController( ContainerVC )对子自定义视图( ChildView )的点击做出反应。

ChildView 中,我重写mouseDown(_:)来处理点击。在此方法中,我尝试通过NSApp.sendAction(#selector(ContainerVC.childViewClicked(_:)), to: nil, from: self)调用 ContainerVC 目标。

由于某种原因,sendAction方法最初失败(即返回false)。 NSApp.target(forAction: #selector(ContainerVC.childViewClicked(_:))也是零。

经过一段时间(通常在我疯狂点击自定义视图一段时间后),目标得到解决,一切正常,并调用ContainerVC.childViewClicked(_ :)。

在目标得到解决的时间/点击次数之后,我无法找到系统模式(除了我在我的mac上大喊大叫的强度)。

有趣的是,当我通过let window = NSWindow(contentViewController: ContainerVC()) ContainerVC 添加到窗口时,它可以正常工作。

当我将 ContainerVC 添加到拆分视图时,会出现上述奇怪的行为:

self.addSplitViewItem(NSSplitViewItem(viewController: ContainerVC())

我检查了 CustomView 的响应者链。 ContainerVC 按预期显示在链中。链中没有其他类实现 childViewClicked(_:)

如果有人能够了解NSApp.sendAction(_ :)的内部工作原理以及为什么目标首先是nil,我会很感激。

将ViewController添加到SplitView以正确连接事物时是否还需要执行其他步骤?

1 个答案:

答案 0 :(得分:0)

来自sendAction(_:to:from:)的文档:

  

如果aTarget为nil,则sharedApplication会查找可以响应消息的对象,即实现与anAction匹配的方法的对象。它从关键窗口的第一个响应者开始。

当ChildView不是第一个响应者时,sendAction(_:to:from:)不起作用。使用

func `try`(toPerform action: Selector, with object: Any?) -> Bool

例如

self.`try`(toPerform: #selector(ContainerVC.childViewClicked(_:)), with: self)

做你想做的事:

  

如果接收者响应anAction,它会以anObject作为参数调用方法并返回YES。如果接收者没有响应,它会将此消息发送给具有相同选择器和对象的下一个响应者。