奇怪的行为:从堆栈拖动到状态项不起作用
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() 时导航栏按钮项不起作用?