4

NSCollectionViewをサブクラス化し、Finderからドラッグされたファイルを受信しようとしています。適切な値を受け取っdraggingEntered:て返していますが、受け取っていprepareForDragOperation:ません(プロセス内のその後のメソッドも受け取りません)。私がここで見逃している明らかな何かがありますか?

コード:

- (void)awakeFromNib
{
    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
    NSLog(@"entered"); //Happens
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];

    if ([[pboard types] containsObject:NSFilenamesPboardType])
    {
        NSLog(@"copy"); //Happens
        return NSDragOperationCopy;
    }

    return NSDragOperationNone;
}

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
    NSLog(@"prepare"); //Never happens
    return YES;
}
4

3 に答える 3

6

これはかなり遅いですが、私は問題を見つけました:

NSCollectionViewは、互換性のない次の実装をサイレントに提供します。

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender

...そしてAppleはこれを文書化していない。そのメソッドを実装してdraggingEnteredメソッドを再度呼び出すと、すべてが正常に機能します。例:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return [self draggingEntered:sender];
}

(私は、このカスタム実装が提供する「魔法」の説明を見つけたいと思ってSOに来ました。これも文書化されていないためです(ありがとう、Apple!)。 CollectionView?)。

更新:特別な魔法がNSCollectionViewのデリゲートオブジェクト内にあるようです。何らかの理由で、Xcode4は私に代理人がいないと主張していましたが、それを割り当ててビルドして正常に実行しました。そこにあるすべてのカスタム/半文書化されたドラッグ/ドロップ方法をチェックしてください。

(または、上記で説明したように実行し、カスタム動作をオーバーライドして、機能し、理解できるものを実装します)

于 2011-05-02T22:40:31.253 に答える
1

NSCollectionViewDelegateプロトコルからこれらのデリゲートメソッドを試してみることをお勧めします

- (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo> )draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation;
- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id <NSDraggingInfo> )draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation;

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event;
- (NSImage *)collectionView:(NSCollectionView *)collectionView draggingImageForItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event offset:(NSPointPointer)dragImageOffset;
- (NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes;
- (BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard;

特に最初の2つの方法。

于 2010-05-03T14:06:00.290 に答える
0

私は少し前にこれを経験しました。直感に反しているように見えましたが、それを機能させる唯一の方法は、関連するスクロールビューをドロップターゲットとして設定することでした。

于 2010-05-03T06:50:12.913 に答える