我希望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以正确连接事物时是否还需要执行其他步骤?
答案 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。如果接收者没有响应,它会将此消息发送给具有相同选择器和对象的下一个响应者。