Objective-c: NSPasteboard: в чем разница - setData: forType :, - setString: forType: и - setPropertyList: forType: - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу знать, в чем разница - 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я в замешательстве, большое спасибо.

...