问题标签 [nsdraggingitem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2382 浏览

macos - 如何在拖动中更改拖放的图像?

所以我想将一个对象从一个源拖到多个潜在目的地。当对象在每个目的地上方时,我希望它“变形”成不同的图像。从 NSDragSource 的角度来看,有没有一种简单的方法可以做到这一点?

0 投票
2 回答
631 浏览

cocoa - NSOutlineView 拖动图片

我想更改从基于视图和数据源的项目中拖动项目时使用的图像NSOutlineView,但似乎找不到挂钩。我试过修改

在 rowViews、tableCellViews 和NSOutlineView自身的子类中,但无济于事。

有谁知道默认图像(显然是从 tableCellView 的图像和文本字段中获取的)来自哪里?

0 投票
1 回答
247 浏览

objective-c - 用于拖动 vom NSTableView 的 NSDragOperation 为 -1

简单设置:

我有一个NSTableView允许将项目拖到NSView子类的方法。

在视图中,我正在通过NSDraggingInfo's 方法检查拖动操作draggingSourceOperationMask

NSDragOperation那里收到的水滴有-1。从视图开始的拖动具有预期的拖动操作(移动、复制,取决于具体情况)。但是表格视图中的拖动完全搞砸了。知道那里发生了什么..?

有什么我可以做的- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes吗?

非常感谢任何提示。

0 投票
1 回答
530 浏览

macos - 避免使用 NSPasteboardItemDataProvider 阻塞 NSDraggingSession 中的主线程

在 Mac OS X 应用程序 (Cocoa) 中,我使用NSDraggingSession. 使用NSDraggingItem实现协议的对象,NSPasteboardItemDataProvider在用户丢弃它时提供数据。

当我处理图像时,所涉及的类型是:NSPasteboardTypePNG、、、和。这些图像位于远程位置,因此在将它们提供给粘贴板之前,我必须从 Internet 下载它们。kPasteboardTypeFileURLPromisekUTTypeFileURLcom.adobe.photoshop-imagepublic.svg-image

我实现了- pasteboard(pasteboard:item:provideDataForType:)这样的方法:

  • 如果请求的类型是kPasteboardTypeFileURLPromise,我将获取粘贴位置,并在粘贴板中构建并设置 URL 字符串,其中包含将来应该写入文件的位置。

  • 如果请求的类型是kUTTypeFileURL,我下载文件,指定一个临时位置并将下载的文件写入该位置。然后,我在粘贴板中设置了该位置的 URL 字符串。

  • 如果请求的类型是其他类型之一,我下载文件并NSData在粘贴板中设置纯文本。

所有这些操作都在主线程上执行,产生了一些我想摆脱的滞后。

我尝试在后台线程上执行这些操作,然后返回主线程在粘贴板中设置最终数据,但这不起作用,因为该方法之前完成。

有谁知道实现它的方法?

0 投票
0 回答
304 浏览

swift - 想要在拖动时将其项目拖动到它所在的位置

我制作了自定义拖动图像并正在使用它。

一个问题是当我拖动项目项目的原点时变成一个空白区域。

我想将原始图像(?)留在原点。

所以我的收藏视图看起来什么也没发生。(当然,鼠标指针下有自定义图像正在拖动。)

请给我一个提示。

谢谢你。

文字很难解释所以我画了一张XD

自定义图像

更新 我的解决方案

  1. 继承 NSCollectionView 进行覆盖func beginDraggingSession(with items: [NSDraggingItem], event: NSEvent, source: NSDraggingSource) -> NSDraggingSession
  2. 获取选定的 indexex
  3. 在循环选定的索引时,制作 NSDraggingItem 并替换来自方法的 arg 的项目,即索引处的内容。此时,如果您制作图像并使用setDraggingFrame拖动设置它,则鼠标指针下的图像将成为您的图像(我没有测试其他方式)并且collectionView将与拖动前一样。

更新 2

我再次阅读代码,发现解决方案实际上很简单。(但我认为这不是可推荐的解决方案......)

并且您需要自己计算需要删除和消失的项目。

0 投票
1 回答
1140 浏览

swift - NSPasteboard 复制拖放文件

虽然我有工作代码,但我对我是否采取了正确的方法感到困惑,我正在寻求NSPasteboard是否有人可以帮助我澄清最佳方法。

自 2012 年以来,Apple 似乎没有编写任何关于拖放的完整文档,并且在那个时候,您应该在其中实现它的方式(尤其是沙盒应用程序)似乎已经被弃用和改变。经过一番折腾,我发现当您访问它的路径属性时,拖动的粘贴板提供的文件 URL 显示了它的真实路径(而不是构成 url 的匿名数字字符串),这使得可以使用进行常规复制FileManager.

我的问题是,我在这里遵循正确的程序吗?将从NSURL粘贴板获得的内容转换为URL类型并在其中使用它copyItem(at:URL, to:URL)不起作用(即使将相同的 url 复制并粘贴到 Safari 中使我能够查看文件)。因此我改用copyItem(atPath:String, toPath:String). 为了进一步研究这一点,是否有URL替换类型的方法NSURL(from:NSPasteboard)?好像应该有。

无论如何,这是我正在工作的代码(请忽略 draggingEntered: 中的代码:目前,它只是让测试工作正常,而且我注册NSFilenamesPboardType但随后忽略它的事实也可以被忽略)。

最后一点是,文档在注册拖动类型时一直提到使用 UTI,但我不清楚这会延伸多远。我应该用尿路感染代替NSURLPboardType和吗?NSFilenamesPboardType