我想要一个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())
我检查了自定义视图的响应器链。ContainerVC按预期出现在链中。链中没有其他类实现childViewClicked(_:)。
如果有人能启发我NSApp.sendAction(_:)的内部工作原理以及为什么目标一开始为零,我将不胜感激。
将视图控制器添加到 SplitView 时是否需要执行其他步骤才能正确连接内容?
来自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。如果接收方没有响应,它会使用相同的选择器和对象将此消息发送给下一个响应者。