我有一个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并返回它返回的内容。