即使target(forAction:...)为nil

时间:2019-03-01 23:54:09

标签: ios uikit first-responder uiresponder

点击子视图(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

此外,我添加了一个扩展名以遍历响应者树以找到第一个响应者,并且在这种情况下它返回nil

如果没有第一响应者,sendAction(…)的工作方式如何?

1 个答案:

答案 0 :(得分:1)

呼叫target(forAction:)只会将请求从该响应者的响应链()传递出去,但这是唯一的after the application in the responder chain is the application delegate。除非在这两个方法中的任何一个中实现了此方法,否则在应用程序实例上调用target(forAction:)都将返回nil

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