确定响应者链是否将处理一个动作

Determine if responder chain will handle an action

The responder chain is cool

特别是,能够将自定义操作发送给第一响应者,这些操作将冒泡给可能感兴趣的任何其他人:[[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],并检查答案是否为零。但似乎没有与 UIApplicationsendAction:… 等效的方法,它会自动从第一响应者开始并继续工作。

您可以检查响应者是否可以像这样响应操作:

[aResponder respondsToSelector:@selector(methodToSend)];

如果它可以响应,它将 return YES。然后你知道调用那个方法是安全的

delightful solution here 可以通过利用响应者链找到第一响应者。

一旦您知道第一响应者,就很容易询问当前响应者链是否处理特定操作。如果您愿意,您甚至可以找出谁来处理它。

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