Определите, будет ли цепочка респондентов обрабатывать действие

Цепочка респондеров — это круто.

В частности, возможность отправлять пользовательские действия первому ответившему, которые будут всплывать всем, кто может быть заинтересован: [[UIApplication sharedApplication] sendAction: @selector(commandToSend) to: nil from: self forEvent: nil].

Или менее настраиваемые действия с:

[[UIApplication sharedApplication] sendAction: @selector(resignFirstResponder) to: nil from: self forEvent: nil]

Я хотел бы знать – есть ли способ проверить заранее, будет ли обработано конкретное действие от конкретного отправителя, если бы оно было отправлено сейчас? Очевидным использованием для этого было бы включение и отключение кнопок, которые отправляют действия в зависимости от того, будет ли это действие обрабатываться в данный момент.

Если вы знаете первого ответившего, я думаю, вы можете сделать [aResponder targetForAction: @selector(methodYouWantToSend) withSender: selfOrSomethingElse] и проверить, является ли ответ нулевым или нет. Но, похоже, не существует метода, эквивалентного sendAction:… UIApplication, который автоматически запустится у первого ответившего и сработает.


person Benjohn    schedule 09.01.2015    source источник


Ответы (2)


Здесь есть восхитительное решение для поиска первого респондента, используя цепочку респондентов.

Как только вы узнаете первого респондента, легко спросить, обрабатывает ли текущая цепочка респондентов конкретное действие. Вы даже можете узнать, кто будет заниматься этим, если хотите.

const SEL action = @selector(theActionYouWantToSend);
UIResponder *const currentTarget = [[UIResponder firstResponder] targetForAction: action  withSender: self];
const bool actionIsHandled = currentTarget != nil;
person Benjohn    schedule 09.01.2015

Вы можете проверить, может ли ответчик ответить на действие следующим образом:

[aResponder respondsToSelector:@selector(methodToSend)];

Если он сможет ответить, он вернет YES. Тогда вы знаете, что безопасно вызывать этот метод

person Chris    schedule 09.01.2015
comment
Это не работает для цепочки респондентов. Он только спрашивает aResponder, может ли он обрабатывать метод. Он не спрашивает цепочку ответчиков, может ли она обработать метод. - person Benjohn; 09.01.2015
comment
Похоже, я собираюсь узнать что-то новое, прочитав статью, на которую вы ссылались тогда :) - person Chris; 09.01.2015
comment
Ты точно такой, чувак. Это потрясающе. Меня также смущает то, что он не так широко известен — он чрезвычайно мощный и элегантный. Например, он предоставляет многое из того, что вам нужно, если вы хотите реализовать переходы на раскрутку. - person Benjohn; 09.01.2015