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