2

我正在尝试在我的应用程序中实现拖放功能,但遇到了 mouseUp 事件未触发的问题。如果我只是在视图上单击并释放它,它就会触发,但如果我拖动,我的 mouseDragged 事件就会触发,仅此而已。

通过尝试不同的事情,我发现问题出在我的 dragImage 调用中,但我现在不知道如何解决它。

这是我的代码:

-(void) mouseDragged:(NSEvent *)theEvent
{
   isDragging = YES;

   if ([selectedCellRowIndex longValue] >= 0)
   {
      NSImage *im = [[NSImage alloc]initWithContentsOfFile:@"/Users/UserName/Desktop/drag.png"];
      NSSize dragOffset = NSMakeSize(0.0, 0.0);
      NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];

      [pboard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]  owner:self];
      [pboard setData:[im TIFFRepresentation] forType:NSTIFFPboardType];

      [self dragImage:im
                   at:downPointRelativeToTable
               offset:dragOffset
                event:theEvent
           pasteboard:pboard
               source:self
            slideBack:YES];
  }
} 

有谁知道我的问题可能出在哪里?!谢谢!

4

2 回答 2

2

在您的代码片段中,您正在获取NSPasteboard实例,但没有将数据复制到其中。这是必需的,否则您的拖动将无法正确启动 - 这可能就是您永远无法获得该mouseUp:事件的原因。

的文档dragImage:at:offset:event:pasteboard:source:slideBack:声明

在调用此方法之前,您必须将要传输的数据放置在板上。为此,获取拖动粘贴板对象(NSDragPboard),声明数据的类型,然后将数据放到粘贴板上。

于 2013-04-05T07:06:30.540 回答
1

我用一个简单的 NSView 后代看到了这一点。在 mouseDown 上启动了拖动操作,并且从未触发 mouseUp。相反,对 super 的调用被阻塞,直到拖动操作完成(显然是本地运行循环)。因此,在调用从 super 返回后,我不得不将 mouseUp 处理放在 mouseDown 函数中。

于 2013-04-05T07:55:59.630 回答