Я хочу знать, в чем разница - setData: forType: - setPropertyList: forType: и - setString: forType: в API NSPasteboard?https://developer.apple.com/documentation/appkit/nspasteboard?language=objc
когда я замечаю описание setPropertyList и setString: This method invokes setData:forType: to perform the write.
и когда я записываю содержимое String в монтажную панель, я должен использовать setString и не могу использовать setData.Если я использую setData, будет исключение:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Calling -setData:forType: on NSPasteboard or NSPasteboardItem with object of type __NSSetM instead of NSData.'
*** First throw call stack:
(
0 CoreFoundation 0x00007fffcd4a92cb __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fffe22da48d objc_exception_throw + 48
2 CoreFoundation 0x00007fffcd527c3d +[NSException raise:format:] + 205
3 AppKit 0x00007fffcb1af86d -[NSPasteboard _setData:forType:index:usesPboardTypes:] + 287
4 libclipboard.so 0x000000010b36b9ea _ZN5cclib9ccsys_api12ClipboardMac16setClipboardDataEPNS0_13ClipboardDataE + 394
И есть еще одна более серьезная ошибка, когда я пытаюсь установить файл на монтажную панель, я использую метод setData.и также получит то же исключение.
Есть ли какой-нибудь пример для установки всех типов монтажных панелей на монтажный картон?
мой код в github: https://github.com/hello-chenchen/cc-clipboard/blob/master/src/clipboard_mac.mm https://github.com/hello-chenchen/cc-clipboard/blob/master/test/test_mac.mm
сегмент кода:
int ClipboardMac::setClipboardData(ClipboardData* data){
//FIXED: fix setString failed error
[pasteboard clearContents]
if(EN_CB_FILES == data->type) {
id buffer = (id)data->bufferData;
cout << "setClipboardData: NSFilenamesPboardType" << endl;
//ERROR: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not write property list with invalid format to the pasteboard. The object contains non-property list types: __NSSetM'
return [pasteboard setPropertyList:buffer forType:NSFilenamesPboardType];
} else if(EN_CB_TEXT == data->type) {
NSString* buffer = (NSString*)data->bufferData;
cout << "setClipboardData: NSStringPboardType" << endl;
return [pasteboard setString:buffer forType:NSStringPboardType];
} else {
cout << "setClipboardData: NSRTFDPboardType" << endl;
return CC_INVALID;
}
}
полный журнал ошибок: https://github.com/hello-chenchen/cc-clipboard/blob/master/log/error.log
я не знаю, нужно ли мне распределять всю длину буфера, который я получаю измонтажная панель с помощью вызова метода dataForType.потому что, когда я копирую тип файла, размер буфера всегда одинаков (я забыл о размере чтения, может быть, 148?).
для полного кода: https://github.com/hello-chenchen/cc-clipboard
iя в замешательстве, большое спасибо.