SendAction () UIApplication работает, даже если target(forAction:…) равен нулю
Этот код вызывается, когда подпредставление (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 ответов
Призвание target(forAction:)
только передаст запрос по цепочке респондента от этого респондента, но после приложения в цепочке респондента будет только делегат приложения. Если этот метод не реализован ни в одном из этих двух, вызов target(forAction:)
на экземпляр приложения вернется nil
,
призвание sendAction(_:to:from:for:)
с nil
Цель работает, потому что она отправляет сообщение первому респонденту, который передает его по цепочке респондента, пока оно не будет обработано.