0

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

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

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

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

在目标得到解决的时间/多少次点击之后,我找不到系统模式(除了我对着我的 mac 大喊大叫的强度)。

有趣的是,当通过let window = NSWindow(contentViewController: ContainerVC()).

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

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

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

如果有人能告诉我 NSApp.sendAction(_:) 的内部工作原理以及为什么最初的目标为零,我将不胜感激。

将 ViewController 添加到 SplitView 以正确连接事物时是否需要额外的步骤?

4

1 回答 1

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。如果接收者没有响应,它会将此消息发送给具有相同选择器和对象的下一个响应者。

于 2018-03-15T10:28:32.150 回答