即使 target(forAction:…) 为 nil,UIApplication 的 sendAction() 仍然有效

UIApplication's sendAction() works even if target(forAction:…) is nil

点击子视图 (imageSlideshow) 时调用此代码:

        imageSlideshow.didTap = { [weak self] in
        guard UIApplication.shared.sendAction(#selector(ImageCarouselViewResponder.didTapImageCarousel(sender:)), to: nil, from: self, for: nil) else {
            assertionFailure("No target for ImageCarouselViewResponder.didTapImageCarousel(sender:)")
            return
        }
        …

正如您从这个调试输出中看到的那样,这按预期工作:

(lldb) po UIApplication.shared.sendAction(#selector(ImageCarouselViewResponder.didTapImageCarousel(sender:)), to: nil, from: self, for: nil) 
true

但是,当我尝试使用相同的选择器请求目标时,它是 nil:

(lldb) po UIApplication.shared.target(forAction: #selector(ImageCarouselViewResponder.didTapImageCarousel(sender:)), withSender: self)
nil

此外,我添加了一个扩展程序来遍历响应者树以找到第一响应者,在这种情况下 returns nil

如果没有急救人员,sendAction(…) 是如何工作的?

正在呼叫 target(forAction:) will only pass the request up the responder chain from that responder, but the only thing after the application in the responder chain is the application delegate。除非在这两个中的任何一个中实现此方法,否则在应用程序实例上调用 target(forAction:) 将 return nil.

使用 nil 目标调用 sendAction(_:to:from:for:) 是可行的,因为它将消息发送到 第一响应者 ,后者将消息向上传递到响应者链,直到它被处理.