【问题标题】:NSApp.sendAction() only works after some timeNSApp.sendAction() 仅在一段时间后才有效
【发布时间】:2018-03-15 09:13:50
【问题描述】:

我希望 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(_:) 的内部工作原理以及为什么最初的目标为零,我将不胜感激。

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

【问题讨论】:

    标签: macos cocoa nssplitview responder-chain


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多