【发布时间】: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