奇怪的行为:从堆栈拖动到状态项不起作用

Posted

技术标签:

【中文标题】奇怪的行为:从堆栈拖动到状态项不起作用【英文标题】: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;

谢谢!

【问题讨论】:

【参考方案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,哦,好吧,回到我猜的原始答案

以上是关于奇怪的行为:从堆栈拖动到状态项不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥当 textview 被 resignedFirstResponder() 时导航栏按钮项不起作用?

在 JS 中工作时,在 Typescript 项目中添加本地依赖项不起作用

为啥 Spinner 中的第一项不起作用

Terraform 模块依赖项不起作用(版本 0.12)

更新不起作用时 Laravel 保存(奇怪的行为)

NavigationBar 后退按钮奇怪的行为并且不起作用