继续学习macOS开发相关内容,在Mac上的操作拖拽是比较常见的,是人机交互的重要部分,最常用的便是Finder文件操作
- 粘贴板和拖拽session
拖拽和投放包含一个 源(source) 和一个目的地(destination)
从一个source拖拽出一个项目,它需要实现 NSDraggingSource 协议。然后投放它到一个destination中,它则必须实现 NSDraggingDestination 协议,为了确定是接受还是拒绝收到的项目。 NSPasteboard 是用来帮助交换数据的类。
整个的过程被称作 dragging session :
当拖拽一个文件的时候,就会发生下列的事:1.当开始拖拽的时候,一个 拖拽session 就开始了
2.选择一些图片数据显示在拖拽粘贴板上
3.将图片投放到一个destination上,它会选择拒绝还是接受它,并采取一些动作 - 例如,移动文件到另一个目录下
4.拖拽session 结束
- 创建一个拖拽的destination 拖拽的destination是一个view或window,它接受来自拖拽粘贴板的数据类型,需要遵守(adopt) NSDraggingDestination 协议来创建拖拽的目的地。
这个图表从拖拽destination的角度,展示了对于拖拽session的剖析。
创建destination包含以下几个步骤:1.当构建view的时候,必须声明从任何的拖拽session中可以接受的类型。
2.当一个拖拽的图片进入这个view的时候你需要去实现决定这个view是否接受这种数据类型的逻辑,并让拖拽session知道这个决定。
3.当拖拽的图片“着陆”(lands on)在这个view上时,你会使用从拖拽粘贴板而来的数据,去展示它在你的view上。
创建一个DestinationView.swift,作为拖拽的目的地
注册view接受的数据类型,定义了支持类型的集合,仅支持 URLs,然后调用 register(forDraggedTypes:) 来接受包含这些类型的拖拽。
override func awakeFromNib() {
setup()
}
var acceptableTypes: Set<String> {