4

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

  • 如果我将一个文件从 Stacks 拖到我的窗口,它会完美运行。
  • 如果我将文件从 Finder 拖到我的窗口,它会完美运行。
  • 如果我将文件从 Finder 拖到我的状态项,它会完美运行。
  • 如果我将一个文件从堆栈拖到我的状态项,它就不起作用。

窗口和状态项都使用完全相同的拖放处理代码。

有趣的是,当文件从 Stacks 拖到状态项上时,光标会按预期更改,因为- (NSDragOperation)draggingEntered:(id)sender { NSPasteboard *pboard; NSDrag操作源DragMask;方法按预期调用。

但是,当文件被删除时,- (BOOL)performDragOperation:(id )sender { NSPasteboard *pboard; NSDrag操作源DragMask;方法不被调用。

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

- (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;
}

谢谢!

4

2 回答 2

6

这是一个合法的问题。我已经为此向 Apple 提交了错误报告。http://openradar.appspot.com/radar?id=1745403

与此同时,我想出了一个解决方法。即使performDragOperation:从未被调用,draggingEnded:仍然是。您仍然可以通过检查“draggingLocation”点是否在 NSView 的矩形内来判断文件是否被拖放到 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];
    }
}

希望这会有所帮助,直到错误得到修复。

于 2012-05-30T23:53:59.307 回答
3

不知道为什么会这样。不喜欢投票最多的强制解决方案。这应该可以解决问题:

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{
    return [sender draggingSourceOperationMask];
}
于 2018-08-07T09:56:45.193 回答