【问题标题】:Weird behavior: dragging from Stacks to status item doesn't work奇怪的行为:从堆栈拖动到状态项不起作用
【发布时间】:2012-03-21 00:42:57
【问题描述】:

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

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

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

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

然而,当文件被删除时,- (BOOL)performDragOperation:(id )sender { 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;
}

谢谢!

【问题讨论】:

    标签: cocoa drag-and-drop nsstatusitem


    【解决方案1】:

    这是一个合法的问题。我已经为此向 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];
        }
    }
    

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

    【讨论】:

    • 如何检测到何时通过按 Esc 取消拖动?它仍然会触发此功能。
    【解决方案2】:

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

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

    【讨论】:

    • 完美运行...谢谢 :)
    • 我在 2021 年尝试这个,但它不起作用:P,哦,好吧,回到我猜的原始答案
    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 2010-10-14
    • 2015-08-04
    • 2012-06-14
    • 2019-12-13
    • 2013-05-28
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多