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

Цепочка респондентов классная.

В частности, возможность отправлять персонализированные действия первому ответчику, который будет пузыриться до любого, кого это может заинтересовать: [[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] и проверить, равен ли ответу или нет. Но, похоже, не существует эквивалентного метода для UIApplication sendAction:…, который будет автоматически запускаться с первого ответчика и работать вверх.

Ответ 1

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

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

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

Ответ 2

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

[aResponder respondsToSelector:@selector(methodToSend)];

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