Cocoa 奇怪的行为:从堆栈拖动到状态项不';行不通

Cocoa 奇怪的行为:从堆栈拖动到状态项不';行不通,cocoa,drag-and-drop,nsstatusitem,Cocoa,Drag And Drop,Nsstatusitem,我的应用程序允许拖动到主窗口和状态项 如果我把一个文件从堆栈拖到我的窗口,它工作得很好 如果我把一个文件从Finder拖到我的窗口,它会工作得很好 如果我把一个文件从Finder拖到我的状态项中,它就可以正常工作 如果我将文件从堆栈拖到我的状态项,它将不起作用。 窗口和状态项使用完全相同的拖放处理代码 有趣的是,当文件从堆栈拖到状态项上时,光标会按预期发生变化,因为-(nsdragooperation)draggingented:(id)发送方{ NSPasteboard*pboard; 按

我的应用程序允许拖动到主窗口和状态项

  • 如果我把一个文件从堆栈拖到我的窗口,它工作得很好
  • 如果我把一个文件从Finder拖到我的窗口,它会工作得很好
  • 如果我把一个文件从Finder拖到我的状态项中,它就可以正常工作
  • 如果我将文件从堆栈拖到我的状态项,它将不起作用。
窗口和状态项使用完全相同的拖放处理代码

有趣的是,当文件从堆栈拖到状态项上时,光标会按预期发生变化,因为-(nsdragooperation)draggingented:(id)发送方{ NSPasteboard*pboard; 按预期调用NSDragOperation sourceDragMask;方法

但是,当文件被删除时,-(BOOL)performDragOperation:(id)发送方{ NSPasteboard*pboard; 未调用NSDragOperation sourceDragMask;方法

以下是第一种方法的实现:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;

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

    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        if (sourceDragMask & NSDragOperationGeneric) {
            return NSDragOperationGeneric;
        }
    }
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        if (sourceDragMask & NSDragOperationLink) {
            return NSDragOperationLink;
        } else if (sourceDragMask & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }

    return NSDragOperationNone;
}
-(nsdragooperation)draggingented:(id)发送方{
NSPasteboard*pboard;
NSDRAGO操作源DRAGMASK;
sourceDragMask=[sender DragingSourceOperationMask];
pboard=[发送方拖动粘贴板];
如果([[pboard types]包含对象:NSColorPboardType]){
if(sourceDragMask和NSDragOperationGeneric){
返回nsdragoOperationGeneric;
}
}
if([[pboard types]包含对象:NSFilenamesPboardType]){
if(sourceDragMask和NSDragOperationLink){
返回NSDragOperationLink;
}else if(源DragMask和NSDragOperationCopy){
返回NSDRAGO操作副本;
}
}
返回nsdragooperationne;
}

谢谢!

这是一个合法的问题。我已经为此向苹果提交了一份错误报告

与此同时,我已经找到了一个解决方法。尽管从未调用过performDragOperation:,但Draggineded:仍然是。您仍然可以通过检查“draggingLocation”点是否在NSView的rect内来判断文件是否被丢弃在NSStatusItem上。以下是一个示例:

- (void)draggingEnded:(id<NSDraggingInfo>)sender
{
    if(NSPointInRect([sender draggingLocation],self.frame)){
        //The file was actually dropped on the view so call the performDrag manually
        [self performDragOperation:sender];
    }
}
-(无效)拖拽:(id)发送方
{
if(NSPointInRect([sender draggingLocation],self.frame)){
//该文件实际上已在视图中删除,因此手动调用performDrag
[自我执行的远程操作:发送方];
}
}

希望这有助于修复错误。

不确定为什么会发生这种情况。我不喜欢投票结果最高的强制解决方案。这应该可以解决问题:

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{
    return [sender draggingSourceOperationMask];
}
-(nsdragooperation)draggingUpdated:(id)发送方
{
返回[sender DragingSourceOperationMask];
}

工作正常…谢谢:)您如何通过按escape来检测何时取消拖动?它仍然会触发此功能。