iOS Swift:如何访问WKWebView中的选定文本

时间:2018-11-13 13:17:58

标签: swift wkwebview uipasteboard nspasteboard

我希望能够使用菜单按钮将所选文本从WKWebView中的网页复制到粘贴板。我想将文本从粘贴板添加到第二个视图控制器中的文本视图中。如何访问和复制WKWebView中的选定文本?

1 个答案:

答案 0 :(得分:1)

雨燕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 Text Types

import MobileCoreServices

在您最初的问题中,您提到要将复制的内容放入第二个textview。如果要保留格式,则需要将复制的数据获取为RTFD,然后将其转换为属性字符串。然后设置textview以显示属性字符串。

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")
    }
}

因为我不知道您的确切项目或用例,所以您可能需要稍微修改一下代码,但是希望我为您提供了项目所需的部分。如果我错过了任何事情,请发表评论。