确定响应者链是否会处理一个行动

响应者链很酷 。

尤其是,能够将自定义操作发送给第一个响应者,这个操作会冒泡给任何可能感兴趣的人: [[UIApplication sharedApplication] sendAction: @selector(commandToSend) to: nil from: self forEvent: nil]

或者更less的自定义操作:

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

我想知道 – 如果现在发送某个特定发件人的特定操作,是否有办法进行testing? 一个明显的用法是启用和禁用发送操作的button,取决于当前是否要处理该操作。

如果你碰巧知道第一个响应者,我想你可以[aResponder targetForAction: @selector(methodYouWantToSend) withSender: selfOrSomethingElse] ,并检查答案是否为零。 但是似乎并没有一个和UIApplicationsendAction:…类似的方法sendAction:…它将自动从第一个响应者开始,并进行处理。

这里有一个愉快的解决scheme ,通过利用响应者链来find第一响应者。

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

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

你可以检查响应者是否可以响应这样的动作:

 [aResponder respondsToSelector:@selector(methodToSend)]; 

如果可以响应,则返回YES 。 那么你知道调用这个方法是安全的