SendAction () UIApplication работает, даже если target (forAction:…) равен нулю - PullRequest
0 голосов
/ 02 марта 2019

Этот код вызывается при касании подпредставления (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 голосов
/ 07 марта 2019

Вызов target(forAction:) только передаст запрос по цепочке респондента от этого респондента , но единственное, что после приложения в цепочке респондента - это делегат приложения.Если этот метод не реализован ни в одном из этих двух способов, вызов target(forAction:) для экземпляра приложения вернет nil.

Вызов sendAction(_:to:from:for:) с целью nil работает, потому что онотправляет сообщение первому респонденту , который передает его по цепочке респондента до тех пор, пока оно не будет обработано.

...