gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:15:03 25 4
gpt4 key购买 nike

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

当大纲 View 位于响应者链中(是第一响应者或其父 View )时,所有复制/粘贴事件都会被 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] 这很适合向第一响应者发送操作。如果在 Action 中使用

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

非常感谢!

最佳答案

这应该有效:

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

但是有一个问题:响应者链中存在实现 -copy: 的响应者本身就会导致启用复制菜单项,即使它不会'如果您的对象不在链中或未实现 -copy:,则不会出现这种情况。您的对象可以使用 -validateMenuItem:-validateUserInterfaceItem: 禁用该项目,但是当且仅当链上存在另一个潜在目标并且该目标时,启用该项目将是很重要的将启用该项目。

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

关于Cocoa:将操作(复制:、粘贴:等)转发到响应者链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25368352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com