2

テーブルビューから行をドラッグしてMacOSX 10.6の他のNSTextFieldにドロップし、テキストの文字列をドロップしたいと思います。

ドラッグアンドドロップはすでに私のアプリ内(NSTableViewとNSBrowserの間)で機能しますが、ソースアプリケーション以外のアプリで受け入れることができるデータをペーストボードに配置することに成功していません。

これが私が試したコードです。他のNSTextFieldにドロップしたときに、「hello」という単語を「貼り付け」するのに十分だと思いました。

-(BOOL) tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes     toPasteboard:(NSPasteboard *)pboard {

    [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
    [pboard setString:@"hello" forType:NSStringPboardType];

return YES;

}

//-

ドロップが受け入れられることを示すカーソルが表示されないので、機能しません。

  • 私が試したこと:
    • Pasteboard識別子の10.5バージョンを使用するNSStringPBoardType
    • 10.6バージョンのNSPasteboardTypeStringを使用します。
    • 私はデータを怠惰に提供していないので、owner=nilを設定します。
    • キー付きアーカイバの使用:[pboard setData:[NSKeyedArchiver archivedRootObject:@ "Hello !!"]]

上記のどれもうまくいきませんでした。「データをエンコードし、持っているものをペーストボードに伝えてから、データを与える」という概念は正しいと思いますが、他のアプリはそれを認識しないため、ペーストボードに正しいデータ型を伝えていないのではないかと思います。 。

どこが間違っているのですか?

ありがとう、ウッディ

4

1 に答える 1

6

これをコントローラクラスに追加しますawakeFromNib

- (void)awakeFromNib {
    [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
    // [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];

}

IBOutlet(これは、という名前のtableViewに接続していることを前提としていますtableView)。awakeFromNib必ず以降にこれを行ってください。(たとえば、コントローラークラスのinitメソッドでこれを実行しようとすると、nibファイルはまだ完全にロードされておらず、IBOutletすべてのファイルがロードされnil、メッセージは効果がありません)。

デフォルトでは、ほとんどのドラッグ操作は、すべてのアプリケーションではなく、ローカルアプリケーションに制限されます。このforLocal:パラメーターは、アプリケーションに対してローカル(同じアプリ内)のドラッグ操作を参照するのか、すべてのアプリケーションを意味する非ローカルのドラッグ操作を参照するのかを指定します。コメントアウトされた行は、基本的に、tableViewがすでに実行していることです。

于 2011-01-01T06:29:01.583 に答える