mouseUp没有在Cocoa中解雇?

时间:2013-04-05 00:38:31

标签: objective-c macos cocoa mouseup

我正在尝试在我的应用中实现拖放功能,并且遇到了我的mouseUp事件未触发的问题。如果我只是在我的视图上单击并释放它就会触发它,但如果我拖动,我的鼠标会拖动 事件发生了,就是这样。

通过尝试不同的事情,我发现问题出在我的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];
  }
} 

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

2 个答案:

答案 0 :(得分:2)

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

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

  

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

答案 1 :(得分:1)

我用一个简单的NSView后代看到了这一点。在mouseDown上启动了拖动操作,并且从未触发mouseUp。相反,在拖动操作完成之前,对超级的调用被阻塞(显然是本地运行循环)。因此,我必须在从super。

返回的调用之后将mouseUp处理放在mouseDown函数中