Как получить содержимое RTF из UIPasteboard после копирования UIWebView?

У меня есть UIWebView, показывающий некоторый пользовательский HTML-контент. Если я нажимаю и удерживаю, затем выбираю текст и нажимаю опцию Copy, текст добавляется к UIPasteboard с помощью ключа «com.apple.rtfd». Моя проблема сейчас в том, что я не могу найти никакого способа извлечь фактическое текстовое содержимое того, что я только что скопировал. Если я использую этот код:

NSString *contents = [NSString stringWithUTF8String:[data bytes]];

он возвращает буквальную строку «rtfd», независимо от того, какой текст я на самом деле скопировал из файла UIWebView. Если я использую этот код:

NSString *contents = [[NSString alloc] initWithData:data 
    encoding:NSUTF8StringEncoding];

Я получаю пустую строку. Как я могу получить фактическое текстовое содержимое того, что я только что скопировал в монтажный стол?


person MusiGenesis    schedule 10.09.2013    source источник


Ответы (2)


Я узнал, что когда вы копируете выделенный текст из UIWebView в UIPasteboard, он фактически помещает несколько значений с ключами в словарь, возвращаемый UIPasteboard, из которых «com.apple.rtfd» является только первым ключом. Фактическое текстовое значение скопированного элемента также включается в ключ "public.text". Этот код можно использовать для извлечения значения:

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
NSArray *dataArray = [pasteboard items];
NSDictionary *dict = (NSDictionary *)[dataArray objectAtIndex:0];
NSString *pastedText;
if ([dict objectForKey:@"public.text"]) {
    // this is a text paste
    pastedText = (NSString *)[dict objectForKey:@"public.text"];
}
person MusiGenesis    schedule 10.09.2013

Правильное решение Swift для извлечения текстового содержимого rft, скопированного из Safari:

guard let rtf = textItem["public.rtf"] as? String,
        let rtfData = rtf.data(using: .utf8) else {
            return
    }
    do {
        let attr = try NSAttributedString(data: rtfData,
                                          options: [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType],
                                          documentAttributes: nil)

        //DO SOMETHING ...
    }
    catch (let exc) {
        print(exc.localizedDescription)
    }
person Siruk Viktor    schedule 31.03.2017