接受NSCollectionView子类中的拖动操作

and*_*n22 4 macos cocoa drag-and-drop objective-c nscollectionview

我已经将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;
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 6

这已经很晚了,但我发现了问题:

NSCollectionView以静默方式提供以下不兼容的实现:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
Run Code Online (Sandbox Code Playgroud)

......并且Apple没有记录这一点.如果您只是实现该方法来重新调用draggingEntered方法,一切正常,例如:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return [self draggingEntered:sender];
}
Run Code Online (Sandbox Code Playgroud)

(我来到SO希望找到这个自定义实现提供的"魔法"的解释,因为那也是......没有文档(谢谢,Apple!).我猜它在管理内插点方面做得很聪明CollectionView?).

更新:似乎特殊魔法在NSCollectionView的委托对象中.由于某种原因,Xcode4声称没有代表给我,但分配它建立并运行正常.查看那里的所有自定义/半文档拖放方法.

(或者就像我上面描述的那样并覆盖自定义行为,并实现有效的东西,你可以理解)