iOS Swift: как получить доступ к выделенному тексту в WKWebView - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы иметь возможность использовать кнопку меню для копирования выбранного текста с веб-страницы в WKWebView на монтажную панель.Я хотел бы получить текст из монтажной панели в текстовое представление во втором контроллере представления.Как получить доступ и скопировать выделенный текст в WKWebView?

1 Ответ

0 голосов
/ 19 декабря 2018

Swift 4

Вы можете получить доступ к общему картону со следующей строкой:

let generalPasteboard = UIPasteboard.general

В контроллере представления вы можете добавить наблюдателя, чтобы наблюдать, когда что-то копируется в монтажный картон.

override func viewDidLoad() {
    super.viewDidLoad()

    // https://stackoverflow.com/questions/35711080/how-can-i-edit-the-text-copied-into-uipasteboard
    NotificationCenter.default.addObserver(self, selector: #selector(pasteboardChanged(_:)), name: UIPasteboard.changedNotification, object: generalPasteboard)
}

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(UIPasteboard.changedNotification)
    super.viewDidDisappear(animated)
}    

@objc
func pasteboardChanged(_ notification: Notification) {
    print("Pasteboard has been changed")
    if let data = generalPasteboard.data(forPasteboardType: kUTTypeHTML as String) {
        let dataStr = String(data: data, encoding: .ascii)!
        print("data str = \(dataStr)")
    }
}

В вышеупомянутой функции pasteboardChanged я получаю данные в виде HTML, чтобы отобразить скопированный форматированный текст во втором контроллере в WKWebView.Вы должны импортировать MobileCoreServices для ссылки на UTI kUTTypeHTML.Чтобы увидеть другие UTI, перейдите по следующей ссылке: Apple Developer - Типы текста UTI

import MobileCoreServices

В своем первоначальном вопросе вы упомянули, что хотите поместить скопированный контент во второе текстовое представление,Если вы хотите сохранить форматирование, вам нужно будет получить скопированные данные как RTFD, а затем преобразовать их в приписанную строку.Затем настройте текстовое представление для отображения атрибутивной строки.

let rtfdStringType = "com.apple.flat-rtfd"

// Get the last copied data in the pasteboard as RTFD
if let data = pasteboard.data(forPasteboardType: rtfdStringType) {
    do {
        print("rtfd data str = \(String(data: data, encoding: .ascii) ?? "")")
        // Convert rtfd data to attributedString
        let attStr = try NSAttributedString(data: data, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.rtfd], documentAttributes: nil)

        // Insert it into textview
        print("attr str = \(attStr)")
        copiedTextView.attributedText = attStr
    }
    catch {
        print("Couldn't convert pasted rtfd")
    }
}

Поскольку я не знаю вашего точного проекта или варианта использования, поэтому вам может потребоваться немного изменить код, но я надеюсь, что предоставил вам кусочки, которые вынужно для проекта.Пожалуйста, прокомментируйте, если я что-то пропустил.

...