【问题标题】:Cocoa: drag and drop inconsistencyCocoa:拖放不一致
【发布时间】:2020-11-02 17:21:06
【问题描述】:

在我的可可代码中,我实现了文件路径的拖放。它是由 mouseDown 触发的不是,而是作为我从 javascript 代码收到的回调的结果(在单击拖动 HTML 对象之后)。

问题在于它只在 80% 的时间内有效:我一遍又一遍地执行相同的单击拖​​动操作并得到两种行为。在两者中,代表拖动文件路径的图标开始跟随光标(如预期的那样)。

现在,在大多数情况下,被拖动的文件路径被接收器“接受”,在拖动过程中给出适当的视觉反馈,最终在释放鼠标时 - 文件路径被接受并丢弃。 但是,有时将鼠标悬停在目标上时文件路径不被“接受”。当发生这种情况并释放鼠标时,图标会滑回其原点,并且文件路径不会拖放到目标上。

这是我的代码(简化版),基于Apple’s docs

void myInitiateDrag(const char * in_filepath, NSView * view)
{
    NSString *nsfilepath = [NSString stringWithUTF8String:in_filepath];
    NSEvent *theEvent = [[view window] currentEvent];
    NSPoint dragPosition = [view convertPoint:[theEvent locationInWindow] fromView:nil];    
    NSRect aRect = NSMakeRect(dragPosition.x, dragPosition.y, 10, 10);
     
    [view dragFile:nsfilepath fromRect:aRect slideBack:YES event:theEvent];
}

在 mouseDown 中使用这个确切的代码可以完美地工作,100% 的时间。但是,正如我所说,在我的情况下,我没有收到 mouseDown。

另一个观察:在拖动操作后释放鼠标按钮时,不会调用 mouseUp。这与我在哪里启动拖动操作无关,并且在另一个SO question 中也提到过。所以,我不知道这是否与我的问题有关。

在我做过的事情中,我试图找出 currentEvent 成功时和不成功时的区别,没有运气。

developer docs 中明确表示“拖动会话由用户在窗口或视图内单击鼠标并移动鼠标启动 [...] 您在 mouseDown: 或 mouseDragged: 方法中调用此方法你的 NSView 或 NSWindow 的子类。”。

这是强制性的吗?我正在做的事情有什么问题,我还有哪些其他选择?

【问题讨论】:

  • 参见NSView,“拖动操作”部分。 dragFile:fromRect:slideBack:event: 已被弃用,并且“只能在 mouseDown: 方法的实现中调用。”。你试过beginDraggingSessionWithItems:event:source:吗? theEvent 总是 mouseDown 事件吗?
  • @Willeke,尝试使用 beginDraggingSessionWithItems:event:source - 它仅适用于 mouseDown 或 mouseDragged,而不适用于 js 回调。

标签: javascript objective-c cocoa drag-and-drop mouseevent


【解决方案1】:

遇到同样的问题,终于可以使用事件副本了:

[ NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskLeftMouseDragged handler:^NSEvent * _Nullable(NSEvent * _Nonnull event) {
    [self.controller mouseEventGlobal:event];
    return event;
}];

在控制器中之后,我可以在收到来自 JS 的回调后使用beginDraggingSessionWithItems:event:source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多