4

アプリケーションで NSTableViews を使用する必要があり、両方とも「CoreData」として保存されているデータを表示します。プログラム全体と同様に、TableView はかなり基本的なものです。

右側の TableView にはチェックリストのリストが表示され、左側にはこのチェックリストの内容が表示されます。ここで、ユーザーがチェックリスト内の項目を別のチェックリストにドラッグできるようにしたいと考えています。

Web でいくつかのチュートリアルとサンプル コードを見つけましたが、Cocoa を理解するにはあまりにも多すぎます。誰かがウェブページやチュートリアルなどを短くてわかりやすい説明で言及してくれたら素晴らしいでしょう.

どうもありがとう

編集: 明らかなはずですが、私のアプリケーションは Cocoa で作成され、Mac 上で実行されます。

4

1 に答える 1

27

ダウンロードページでドラッグアンドドロップで NSOutlineView を使用する方法についての小さなデモがあります: http://davedelong.com/downloads NSOutlineView は NSTableView のサブクラスであるため、NSTableView にかなり適用できるはずです。

これは、約 1 か月間ドキュメントを読んで学んだことを 5 分間要約したものです。NSTableViews からドラッグ アンド ドロップするときに使用される 3 つの「基本的な」NSTableView デリゲート メソッドがあります。彼らです:

  1. - (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation;

  2. - (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation;

  3. - (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard;

最初のものtableView:acceptDrop:row:dropOperation:は、誰かがあなたの NSTableView に何かをドラッグしたときに使用されます。それはかなり簡単です。ドロップに関するすべての情報 (ドロップされるものを含む) は、 にあり[info draggingPasteboard]ます。YESドロップが成功した場合は戻り、NOそうでない場合は戻ります。

tableView:validateDrop:proposedRow:proposedDropOperation:誰かがあなたの NSTableView に何かをドロップしたい場合に使用されます。この時点では、ドロップの発信元は重要ではありません。重要なのは、彼らがあなたの上に浮かんでいるということだけであり、あなたは彼らが何ができるかを言わなければなりません. たとえば、特定の行 ('proposedRow') の上にカーソルを置いていて、その行にアイテムがドロップされるのを許可したくない場合は、 を返しNSDragOperationNoneます。または、情報の内容をコピーしたい場合があります ( return NSDragOperationCopy)。あなたが示すことができるさまざまな種類の操作がたくさんあります。ニーズに適したものを使用してください。(これらの戻り値は、それに応じてカーソルを調整します。したがって、NSDragOperationCopy を返すと、カーソルは小さな緑色の+円を取得します。)

最後のメソッドtableView:writeRowsWithIndexes:toPasteboard:は、ユーザーが NSTableView でいくつかの行を選択し、それらをドラッグし始めたときに呼び出されます。ドラッグするペーストボードにそれらの行に対応する情報を提供する必要があるため、他の場所にドロップできます。このメソッドを使用して NSManagedObjects をペーストボードに提供する方法の簡単な例を次に示します。

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard {
  [pboard declareTypes:[NSArray arrayWithObject:kMyCustomDragType] owner:self];
  //get an array of URIs for the selected objects
  NSMutableArray * rows = [NSMutableArray array];
  NSArray * selectedObjects = [arrayOfManagedObjects objectsAtIndexes:rowIndexes];
  for (NSManagedObject * o in selectedObjects) {
    [rows addObject:[[o objectID] URIRepresentation]];
  }
  NSData * encodedIDs = [NSKeyedArchiver archivedDataWithRootObject:rows];
  [pboard setData:encodedIDs forType:kMyCustomDragType];
  return YES;
}

この背後にある考え方は、選択した各 NSManagedObject の objectID の URIRepresentation をエンコードし、それをペーストボードに置くことです。このデータをタイプ「kMyCustomDragType」(NSString) の下の dragingPasteboard に置きます。これは、タイプ kMyCustomDragType のドロップを受け入れることを示したオブジェクトだけがこのドロップを受け取ることができることを意味します。最後YESに、ペーストボードへのデータの書き込みに成功したことを示します。NO(失敗した場合は返却)

これを機能させることができれば、必要なすべてのドラッグ アンド ドロップ機能の 90% をおそらく利用できます。残りの 10% は、見知らぬ要件から発生します。いつものように、ドキュメンテーションはあなたの親友です。

于 2009-09-05T15:45:30.003 に答える