Cocoa:将动作(复制、粘贴等)转发到响应链



我有一个NSOutlineView的子类,实现了copy:, paste:, cut:等。同样,NSDocument子类实现了这些相同的方法。

当大纲视图在响应器链中(是第一个响应器或它的父视图),所有复制/粘贴事件都被NSOutlineView子类截获。我想要的,是根据上下文捕获这些消息中的一些,或者让它们传播并被NSDocument子类捕获。

我想要的基本上是:

- (void)copy:(id)sender
{
    // If copy paste is enabled
    if ([self isCopyPasteEnabled]) {
        [[NSPasteboard generalPasteboard] clearContents];
        [[NSPasteboard generalPasteboard] writeObjects:self.selectedItems];
        return;
    }
    // If copy paste is disabled
    // ... forward copy: message to the next responder,
    // up to the NSDocument or whatever
}

我已经尝试了很多方法,但都没有成功:

  • [[self nextResponder] copy:sender]不工作,因为下一个响应器可能不会实现copy:
  • [super copy:sender]同样,super没有实现copy:
  • [NSApp sendAction:anAction to:nil from:sender]这是很好的发送一个动作到第一个响应器。如果在动作
  • 中使用

当然,我可以在响应链上手动循环,直到我找到响应copy:的东西,甚至直接调用当前文档上的copy:,但我正在寻找正确的方法。

提前感谢!

应该可以:

[[self nextResponder] tryToPerform:_cmd with:sender];

有一个问题,虽然:在实现-copy:的响应器链中的响应器的存在,在其本身,导致复制菜单项被启用,即使它不会否则,如果你的对象不在链中或没有实现-copy:。您的对象可以使用-validateMenuItem:-validateUserInterfaceItem:禁用该项目,但当且仅当链上存在另一个潜在目标并且该目标将启用该项目时,启用该项目将是非平凡的。

另一种方法是,如果禁用粘贴板支持,则只需搜索实现动作方法的响应器,跳过大纲视图。覆盖-respondsToSelector:。如果选择器是粘贴板操作之一,并且您的粘贴板支持被禁用,则返回false,即使您的类确实实现了它。也就是说,谎称你的对象没有响应那些选择器。对于任何其他选择器,或者如果您的粘贴板支持打开,则调用super并返回它返回的内容。

最新更新