K2.05.2drop target type declaration设计

需声明可接受的数据类型

别名: 拖放类型 · UTI · MIME type drop · pasteboard types

概念解释

目标应用必须事先声明自己收哪些数据类型:文件、纯文本、富文本、图片、URL、表格,或一种自定义的行业类型。操作系统用这份声明去匹配源应用放上拖放剪贴板的表示。没声明,指针进了窗口也不是目标;声明错了,松手会收下不该收的东西,或拒收本可以收的东西。

声明是跨应用合同,不是「看起来能放下」的视觉提示。视觉提示建立在合同已经匹配之后。

机制

源应用通常会给同一对象准备多种表示:一个表格可以是 Tab 分隔文本、HTML、一张图、一份原生对象。目标只认自己声明过的那些。匹配在指针还在移动时就要发生,光标和目标高亮才能告诉人「这里收」或「这里不收」。合同若到松手才被查阅,整段拖动都在撒谎。

类型要足够具体。只声明「文件」会让应用收下自己打不开的格式,失败被推迟到放下之后。只声明一种过于狭窄的私有类型,别的应用给不出这种表示,桌面上最常见的文件夹、浏览器、邮件全部拖不进来。好的声明是一张有序清单:最富的原生形式优先,其次是仍能保住结构的中间形式,最后是纯文本这类保底。顺序也是合同的一部分——目标按自己的优先取第一种匹配,源按同一精神提供。

边界

有些对象没有第二种表示(加密容器、硬件令牌),声明可以很窄,但拒绝时仍要能被识别为「类型不对」而不是「拖放坏了」。Web 内容拖进原生应用,类型名在浏览器和操作系统之间会丢一层,声明需要同时覆盖这一层的别名。只在应用内部拖排序的列表,类型合同是私有的,不必对外声明;一旦对象能被拖出窗口,合同立刻变成公共的。

怎么落地

  • 为每个可放下的区域写清接受的类型清单和优先级;指针进入时只在匹配成功的区域给出「可放下」的光标与高亮。
  • 同一对象对外提供不止一种表示,保证文件夹、浏览器、邮件至少能以一种保底形式进来或出去。
  • 验证:分别拖入一张图、一段纯文本、一个不支持的专有文件、一个 URL。匹配的区域在进入时就高亮,不匹配的区域全程保持「不可放下」。打开目标里实际得到的数据,确认取到的是清单上优先的那种表示,而不是碰巧的第一种。

延伸

  • 同组K2.05.1 拖放是桌面的跨应用数据通道 · K2.05.3 拖放失败需给出原因
  • 相邻K2.10 剪贴板与系统服务 · C1.08 拖放
  • 站内检索drop target types · UTI · pasteboard flavor

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/K2.05.2