简述
剪贴板服务器在所有运行的应用建共享。它包含了用户剪贴或者复制的数据。
NSPasteboard 对象是一个应用处理剪贴操作的唯一接口。
NSPasteboard 对象同时用来在应用和 应用服务目录提供的服务之间传输数据。
一个剪贴板可以包含多个items, 你可以直接读写任何遵守 NSPasteboardWriting 和 NSPasteboardReading 协议的对象。这允许你不使用任何中介,直接去读写常见的item,如 URLs, colors, images, strings, attributed strings, 和 sounds
相关类
- NSPasteboard
- NSPasteboardItem
协议
- NSPasteboardWriting
- NSPasteboardWriting
- NSPasteboardTypeOwner
- NSPasteboardReading
使用
1、复制内容到剪贴板
复制文字
- (void)pasteString{
NSPasteboard *paste = [NSPasteboard generalPasteboard];
[paste clearContents];
[paste writeObjects:@[@"123"]];
}
- 复制前,最好清空剪贴板,否则可能复制失败。
- 注意,并非
[[NSPasteboard generalPasteboard] writeFileContents:@"123"];
- 可以同时复制多个字符串,获取时,会换行分格输出所有。
2、获得剪贴板的文字内容
获得文字
- 如果你拷贝的是文件里面的文字,剪切板里保存是刚复制的字符串,;
- 如果你拷贝的是一个或多个的文件,文件夹, 这里就是文件或文件夹的名称
- (void)getPasteString{
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
if ([[pasteboard types] containsObject:NSPasteboardTypeString]) {
NSString *str = [pasteboard stringForType:NSPasteboardTypeString];
NSLog(@"粘贴的文字:%@",str);
}
}
3、获取剪贴板所有信息
- (void)getPasteboard{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSLog(@"\n-\nname : %@, changeCount : %ld",pb.name,pb.changeCount); // name : Apple CFPasteboard general, changeCount : 2479
NSLog(@"types : %@",pb.types);
NSArray *itemsArray = [pb pasteboardItems];
NSLog(@"pasteboardItems : %@",pb.pasteboardItems);
for (NSPasteboardItem *item in itemsArray) {
NSLog(@"item.types : %@",item.types);
}
NSLog(@"--------------------------");
NSArray *pbtypes = @[NSPasteboardTypeString, NSPasteboardTypePDF, NSPasteboardTypeTIFF,
NSPasteboardTypePNG, NSPasteboardTypeRTF, NSPasteboardTypeRTFD,
NSPasteboardTypeHTML, NSPasteboardTypeTabularText, NSPasteboardTypeFont,
NSPasteboardTypeRuler, NSPasteboardTypeColor, NSPasteboardTypeSound,
NSPasteboardTypeMultipleTextSelection, NSPasteboardTypeTextFinderOptions, NSPasteboardTypeURL,
NSPasteboardTypeFileURL, NSFileContentsPboardType, NSPICTPboardType];
for (NSString *type in pbtypes) {
if ([[pb types] containsObject:type]) {
//如果你拷贝的是文件里面的文字,剪切板里保存是刚复制的字符串,;
//如果你拷贝的是一个或多个的文件,文件夹, 这里就是文件或文件夹的名称
NSString *str = [pb stringForType:type];
NSData *data = [pb dataForType:type];
NSArray *propertyList = [pb propertyListForType:type];
NSLog(@"type : %@, str : %@, data : %ld,propertyList : %@",type,str,data.length,propertyList);
if ([type isEqualToString:NSPasteboardTypeFileURL]) {
[[NSWorkspace sharedWorkspace] openFile:[NSURL URLWithString:str].path];
}
}
}
return ;
}
NSPasteboardType 与 UTI
剪贴板打印出来的 type 类型,是APPKIT_EXTERN NSPasteboardType const
, 实际是文件的 UTI 类型。
NSPasteboardType
- NSPasteboardTypeString //
public.utf8-plain-text
, Replaces NSStringPboardType - NSPasteboardTypePDF //
com.adobe.pdf
, Replaces NSPDFPboardType - NSPasteboardTypeTIFF //
public.tiff
, Replaces NSTIFFPboardType - NSPasteboardTypePNG //
public.png
- NSPasteboardTypeRTF //
public.rtf
, Replaces NSRTFPboardType - NSPasteboardTypeRTFD //
com.apple.flat-rtfd
, Replaces NSRTFDPboardType - NSPasteboardTypeHTML //
public.html
, Replaces NSHTMLPboardType - NSPasteboardTypeTabularText //
public.utf8-tab-separated-values-text
, Replaces NSTabularTextPboardType - NSPasteboardTypeFont //
com.apple.cocoa.pasteboard.character-formatting
Replaces NSFontPboardType - NSPasteboardTypeRuler //
com.apple.cocoa.pasteboard.paragraph-formatting
, Replaces NSRulerPboardType - NSPasteboardTypeColor //
com.apple.cocoa.pasteboard.color
, Replaces NSColorPboardType - NSPasteboardTypeSound //
com.apple.cocoa.pasteboard.sound
, Replaces NSSoundPboardType - NSPasteboardTypeMultipleTextSelection //
com.apple.cocoa.pasteboard.multiple-text-selection
Replaces NSMultipleTextSelectionPboardType - NSPasteboardTypeTextFinderOptions //
com.apple.cocoa.pasteboard.find-panel-search-options
Replaces NSPasteboardTypeFindPanelSearchOptions - NSPasteboardTypeURL //
public.url
, Equivalent to kUTTypeURL - NSPasteboardTypeFileURL //
public.file-url
, Equivalent to kUTTypeFileURL - NSFileContentsPboardType //
NXFileContentsPboardType
- NSPICTPboardType //
Apple PICT pasteboard type
关于 UTI:
UTI: Uniform Type Identifier,统一类型标识符
Mac 下的文件类型被定义为 UTI ,可以把它看成下一代的MIME类型。 HTML 文件的 UTI 是 public.html
; Word 文档的 UTI 是 com.microsoft.word.doc
。
– Uniform Type Identifiers Overview
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html
中文
https://www.jianshu.com/p/d6fe1e7af9b6
使用 setData:forType:
方法会写入第一个 pasteboard item,不需要去创建 item, 如 :
[pboard clearContents];
[pboard setData:data forType:type];
4、剪贴板数据变化 changeCount
IOS 中可以通过 UIPasteboardChangedNotification 监听,macOS 目前没有监听变化的通知。
但如果你希望用户返回你的应用时,得知剪贴板是否变化,可以对比剪贴板的 changeCount 值。changeCount 记录了剪贴板变化的次数,可以在 windowDidBecomeKey 中对比上次的 changeCount。
我观察到本机上 changeCount 变化一般是隔两位,比如上次是 2821,下次改变后是 2823,不知道是什么原理。
参考资料
- 想名真难:NSPasteboard 整理
http://blog.csdn.net/u014600626/article/details/53635192 - 九天雁翎:MacOS中的剪贴板操作 With Objective C
http://blog.csdn.net/vagrxie/article/details/5344706