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:またはを使用してそのアイテムを無効にすることができますが-validateUserInterfaceItem:、チェーンの上に別の潜在的なターゲットがあり、そのターゲットがアイテムを有効にする場合にのみ有効にすることは重要です。

別のアプローチは、ペーストボード サポートを無効にする場合、アクション メソッドを実装するレスポンダーの検索でアウトライン ビューをスキップすることです。オーバーライドし-respondsToSelector:ます。セレクターがペーストボード操作の 1 つであり、ペーストボード サポートが無効になっている場合は、クラスが実際に実装していても false を返します。つまり、嘘をついて、オブジェクトがそれらのセレクターに応答しないと主張します。他のセレクターの場合、またはペーストボードのサポートがオンの場合は、スーパーを呼び出して、返されたものを返します。

于 2015-04-29T21:17:06.213 に答える