首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从WKWebView中的自定义UIMenuItem获取所选文本

从WKWebView中的自定义UIMenuItem获取所选文本
EN

Stack Overflow用户
提问于 2018-12-31 07:11:23
回答 1查看 781关注 0票数 2

我正在创建一个具有自定义UIMenuItem的iOS应用程序。当在WKWebView中选择文本时,就会显示这个新的自定义UIMenuItem。如何获取所选文本。

我按照https://stackoverflow.com/a/49761522/6828076中的说明创建了一个自定义UIMenuItem。它工作得很好,但我需要在点击自定义UIMenuItem时使用的选定文本。有许多关于使用UIPasteboard的帖子,但自定义项不会将所选文本复制到UIPasteboard中,因此我无法检索它。

代码语言:javascript
复制
func setupCustomMenu() {
    let customMenuItem = UIMenuItem(title: "Foo", action:
        #selector(ViewController.transelateMenuTapped))
    UIMenuController.shared.menuItems = [customMenuItem]
    UIMenuController.shared.update()
}

@objc func transelateMenuTapped() {
    let yay = //Need to retrieve the selected text here
    let alertView = UIAlertController(title: "Yay!!", message: yay, preferredStyle: .alert)
    alertView.addAction(UIAlertAction(title: "cool", style: .default, handler: nil))
    present(alertView, animated: true, completion: nil)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-31 07:49:31

你可以使用Javascript来实现这一点。

以下是您使用的答案中的代码,稍作修改,通过在WKWebView上评估Javascript来获得所选文本:

代码语言:javascript
复制
import UIKit
import WebKit

class ViewController: UIViewController {
    weak var webView: CustomMenuWebView!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        prepareWebView()
    }

    @objc func translateMenuTapped(_ test: Any) {
        webView.evaluateJavaScript("window.getSelection().toString()") { (test, error) in
                guard let test = test as? String, error == nil else { return }
                // ***** Here's the user's selected text *****
                print(test) 
        }
    }
}

private extension ViewController {
    func prepareWebView() {
        addWebViewToView()
        loadWebViewContent()
        setupCustomMenu()
    }

    func addWebViewToView() {
        let webView = CustomMenuWebView(
            frame: view.bounds, configuration: WKWebViewConfiguration())
        view.addSubview(webView)
        self.webView = webView
    }

    func loadWebViewContent() {
        let url = URL(string: "https://www.google.com")
        let request = URLRequest(url: url!)
        webView.load(request)
    }

    func setupCustomMenu() {
        let customMenuItem = UIMenuItem(
            title: "Translate", action: #selector(ViewController.translateMenuTapped))
        UIMenuController.shared.menuItems = [ customMenuItem ]
        UIMenuController.shared.update()
    }
}

class CustomMenuWebView: WKWebView {
    // Turn off all other menu items
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53982186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档