4

ドラッグアンドドロップ操作でオブジェクトへのポインタを渡すことは可能ですか?

これがシナリオです...

カスタムオブジェクトの「NSArray」があります。議論のために、これは人物オブジェクトのリストであると言います。

NSTableViewリストは、を介して関連付けられていNSArrayControllerます。はNSTableViewドラッグソースでありNSView、ドラッグ先としてあります。

NSArrayControllerドラッグアンドドロップを実装すると、ドラッグプロセスでとして現在選択されている人の名前を簡単に取得しNSString、のレシーバーに渡すことができますNSView

ただし、受信者がオブジェクト全体にアクセスできるように、personオブジェクトへのポインターを渡すことができるようにしたいと思います。

問題は、ドラッグ操作によって人物オブジェクトの新しいインスタンスが作成され、人物モデルに必要なメソッドを実装しているにもかかわらず、選択した人物オブジェクトへの参照が作成されないことです。その結果、宛先で人物オブジェクトを取得しましたが、オブジェクトからのデータが入力されていません。

NSViewNSViewは、オブジェクト自体への更新がと(およびオブジェクトが使用される他のすべての場所)の両方に反映されるようにオブジェクト参照を利用するため、理想的にはオブジェクトポインターが必要ですNSTableView

ドラッグアンドドロップ操作でオブジェクト参照を使用することも可能ですか、それとも人物オブジェクトのiVarであるカスタム参照を渡し、宛先に到着したらルックアップを実行する必要がありますか?(これは、Obj-cを参照するオブジェクトの量を考えると少し古風に思えます)。

ターゲットがアプリケーションの外部からドラッグ操作を受け入れることができることを理解していますが、ローカル操作として操作を指定すると、これが考慮されますか?

アップルのドキュメントを確認しましたが、まだ答えが見つからないようです。

ドラッグアンドドロッププログラミングトピック

厚紙プログラミングガイド

ありとあらゆる助けが大いに感謝されます。

4

1 に答える 1

3

厚紙はさまざまな種類のデータの単なるコンテナであるため、厚紙に置くものはすべて、ある種類のデータに変換できる必要があります。

必要なのは、各Personオブジェクトにある種の識別子を与え、それを独自の発明のカスタムタイプ識別子の下のペーストボードに配置することです。通常、このような識別子は、アプリケーションのバンドル識別子(ドメイン名とアプリケーション名の逆である必要があります(例:com.example.surfwriter))とタイプの名前(例:com.example.surfwriter)である必要があります。 .tabstop)。

ドロップを受け取ったら、このタイプを確認してください。それが存在する場合は、正しいオブジェクトを検索し、それを使用して想定されていることをすべて実行します。テーブルビューから同じテーブルビューへのドラッグは、オブジェクトを新しい行に移動またはコピーすることによってこれを実装する必要があります。

オブジェクトのアドレス(つまり、オブジェクト自体)を識別子として使用しないでください。オブジェクトが停止した場合(たとえば、削除された場合)、アドレスは無効になるか、別のオブジェクトを参照している可能性があります(元のオブジェクトと同じクラスである場合とそうでない場合があります)。調べても安全に見つけられないものを使用してください。これは、ドラッグよりもカット/コピーアンドペーストに適用されますが、ほぼ同じコードで両方を処理でき、処理する必要があります。

于 2010-09-23T03:23:45.380 に答える