5

我有一个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]同样在这里,超级没有实现copy:
  • [NSApp sendAction:anAction to:nil from:sender]很高兴向第一响应者发送操作。如果在动作中使用

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

提前谢谢了!

4

1 回答 1

3

这应该有效:

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

但是有一个问题:-copy:如果您的对象不在链中或没有实施-copy:-validateMenuItem:您的对象可以使用or禁用该项目-validateUserInterfaceItem:,但当且仅当链上有另一个潜在目标并且该目标将启用该项目时,启用该项目将是不平凡的。

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

于 2015-04-29T21:17:06.213 回答