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 Цель работает, потому что она отправляет сообщение первому респонденту, который передает его по цепочке респондента, пока оно не будет обработано.

Другие вопросы по тегам