点击子视图(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(…)
的工作方式如何?
答案 0 :(得分:1)
呼叫target(forAction:)
只会将请求从该响应者的响应链()传递出去,但这是唯一的after the application in the responder chain is the application delegate。除非在这两个方法中的任何一个中实现了此方法,否则在应用程序实例上调用target(forAction:)
都将返回nil
。
使用nil
目标调用sendAction(_:to:from:for:)
是可行的,因为它将消息发送到第一响应者,该消息将其沿响应者链向上传递,直到得到处理。