私は、選択したオブジェクトを新しい場所にドラッグすることで再配置したいオブジェクトのグリッドを持っていたこと以外は同様の要件がありました。これを行うには、カスタムオブジェクトを作成し、とNSPasteboardReading
のプロトコル(NSPasteboardReadingAsKeyedArchive
というデータを読み取る場合はNSCoding
プロトコル)を実装するなど、いくつかの方法がありますが、これは内部に残っているオブジェクトのドラッグ応用。
NSPasteboardItem
をカスタムUTIタイプのラッパーとして使用しています(すでにNSPasteboardWriting
とNSPasteboardReading
プロトコルを実装しています)。 「XXXが有効なUTI文字列ではありません:これは、そうでない場合は、フォームのエラーが発生します「com.domain.MyApp」形式で定義する必要が
#define kUTIMyCustomType @“com.mycompany.MyApp.MyCustomType”
:最初のカスタムUTIタイプを宣言します。無効なUTIのデータを設定することはできません」Appleはこれをドキュメントに記述しています。
次に、このカスタムUTIタイプを、ドラッグが発生するビューに登録する必要があります。これは実行時に行うことができ、.plistの追加は必要ありません。あなたのビューのinitメソッドでは、以下を追加します。
今
[self registerForDraggedTypes:[NSArray arrayWithObjects:(NSString *)kUTIMyCustomType, nil]];
、デリゲートは、このビューの設定、およびデリゲートオブジェクトが必要NSDraggingSource
とNSDraggingDestination
プロトコルのメソッドを実装していることを確認してください。これにより、指定されたコントローラオブジェクトが、モデルデータ(つまりインデックス)をクエリすることを含む可能性のあるペーストボード上のデータの配置を処理できるようにすることで、MVCデザインパターンの破損を回避できます。ドラッグするときに具体的には、オブジェクトのインデックスをペーストボードドラッグに配置するために移動する
は、あなたのインデックスデータのNSPasteboardItem
ラッパーとして開始されます:
- (void) draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint
{
NSPasteboard * pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard clearContents];
NSMutableArray * selectedIndexes = [NSMutableArray array];
// Add NSString indexes for dragged items to pasteboard in NSPasteboardItem wrappers.
for (MyModel * myModel in [self selectedObjects])
{
NSPasteboardItem * pasteboardItem = [[[NSPasteboardItem alloc] init] autorelease];
[pasteboardItem setString:[NSString stringWithFormat:@"%@", [myModel index]]
forType:kUTIMyCustomType];
[selectedIndexes addObject:pasteboardItem];
}
[pboard writeObjects:selectedIndexes];
}
そして、ドラッグ操作が完了すると、ドラッグしたインデックスを読むことNSPasteboardItem
データ:
ありがとう、私は応答を感謝します。私はまだ、行が再配置されるのを追跡するのはとても複雑だと本当に驚いています。 – livings124
'writableTypesForPasteboard:'に対して私のカスタムUTIを返す 'NSPasteboardWriting'に適合するオブジェクトを実装しましたが、_'TableViewDataType 'は有効なUTI文字列ではありません。無効なUTIを-writeableTypesForPasteboardから返された型として使用することはできません:class TableViewDragNode._ – livings124
の場合Info.plistでのドラッグ操作のカスタムUTIを宣言する以外に、オプションはありません。私は同意する、これは奇妙な制限であるようだ。私は実行時にUTIを定義することはできないと考えています。Info.plistでハードコードされている必要があります。 –