即使 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:)
是可行的,因为它将消息发送到 第一响应者 ,后者将消息向上传递到响应者链,直到它被处理.
点击子视图 (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:)
是可行的,因为它将消息发送到 第一响应者 ,后者将消息向上传递到响应者链,直到它被处理.