iOS Swift: How to access selected text in WKWebView










1















I would like to be able to use a menu button to copy selected text from a web page in WKWebView to the pasteboard. I would like to get the text from the pasteboard into a text view in a second view controller. How do I access and copy the selected text in the WKWebView?










share|improve this question






















  • The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

    – SHS
    Nov 13 '18 at 13:29











  • @Zach If you've found a solution, please post. It will be a big help to me, thanks!

    – olearyj234
    Dec 11 '18 at 21:55















1















I would like to be able to use a menu button to copy selected text from a web page in WKWebView to the pasteboard. I would like to get the text from the pasteboard into a text view in a second view controller. How do I access and copy the selected text in the WKWebView?










share|improve this question






















  • The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

    – SHS
    Nov 13 '18 at 13:29











  • @Zach If you've found a solution, please post. It will be a big help to me, thanks!

    – olearyj234
    Dec 11 '18 at 21:55













1












1








1


1






I would like to be able to use a menu button to copy selected text from a web page in WKWebView to the pasteboard. I would like to get the text from the pasteboard into a text view in a second view controller. How do I access and copy the selected text in the WKWebView?










share|improve this question














I would like to be able to use a menu button to copy selected text from a web page in WKWebView to the pasteboard. I would like to get the text from the pasteboard into a text view in a second view controller. How do I access and copy the selected text in the WKWebView?







swift wkwebview uipasteboard nspasteboard






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 13 '18 at 13:17









Zach FrossZach Fross

62




62












  • The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

    – SHS
    Nov 13 '18 at 13:29











  • @Zach If you've found a solution, please post. It will be a big help to me, thanks!

    – olearyj234
    Dec 11 '18 at 21:55

















  • The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

    – SHS
    Nov 13 '18 at 13:29











  • @Zach If you've found a solution, please post. It will be a big help to me, thanks!

    – olearyj234
    Dec 11 '18 at 21:55
















The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

– SHS
Nov 13 '18 at 13:29





The following link of another similar question in Objective C. May help you to convert it to swift. stackoverflow.com/q/50846404/2641380

– SHS
Nov 13 '18 at 13:29













@Zach If you've found a solution, please post. It will be a big help to me, thanks!

– olearyj234
Dec 11 '18 at 21:55





@Zach If you've found a solution, please post. It will be a big help to me, thanks!

– olearyj234
Dec 11 '18 at 21:55












1 Answer
1






active

oldest

votes


















1














Swift 4



You can access the general pasteboard with the following line:



let generalPasteboard = UIPasteboard.general


In the view controller, you can add an observer to observe when something is copied to the pasteboard.



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




In the above pasteboardChanged function, I get the data as HTML in order to display the copied as formatted text in a second controller in a WKWebView. You must import MobileCoreServices in order to reference the UTI kUTTypeHTML. To see other UTI's, please see the following link: Apple Developer - UTI Text Types



import MobileCoreServices


In your original question, you mentioned you want to put the copied content into a second textview. If you want to keep the formatting, you will need to get the copied data as RTFD then convert it to an attributed string. Then set the textview to display the attributed string.



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




Because I don't know your exact project or use case so you may need to alter the code a little but I hope I provided you with pieces you need for project. Please comment if there's anything I missed.






share|improve this answer






















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53281885%2fios-swift-how-to-access-selected-text-in-wkwebview%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Swift 4



    You can access the general pasteboard with the following line:



    let generalPasteboard = UIPasteboard.general


    In the view controller, you can add an observer to observe when something is copied to the pasteboard.



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




    In the above pasteboardChanged function, I get the data as HTML in order to display the copied as formatted text in a second controller in a WKWebView. You must import MobileCoreServices in order to reference the UTI kUTTypeHTML. To see other UTI's, please see the following link: Apple Developer - UTI Text Types



    import MobileCoreServices


    In your original question, you mentioned you want to put the copied content into a second textview. If you want to keep the formatting, you will need to get the copied data as RTFD then convert it to an attributed string. Then set the textview to display the attributed string.



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




    Because I don't know your exact project or use case so you may need to alter the code a little but I hope I provided you with pieces you need for project. Please comment if there's anything I missed.






    share|improve this answer



























      1














      Swift 4



      You can access the general pasteboard with the following line:



      let generalPasteboard = UIPasteboard.general


      In the view controller, you can add an observer to observe when something is copied to the pasteboard.



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




      In the above pasteboardChanged function, I get the data as HTML in order to display the copied as formatted text in a second controller in a WKWebView. You must import MobileCoreServices in order to reference the UTI kUTTypeHTML. To see other UTI's, please see the following link: Apple Developer - UTI Text Types



      import MobileCoreServices


      In your original question, you mentioned you want to put the copied content into a second textview. If you want to keep the formatting, you will need to get the copied data as RTFD then convert it to an attributed string. Then set the textview to display the attributed string.



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




      Because I don't know your exact project or use case so you may need to alter the code a little but I hope I provided you with pieces you need for project. Please comment if there's anything I missed.






      share|improve this answer

























        1












        1








        1







        Swift 4



        You can access the general pasteboard with the following line:



        let generalPasteboard = UIPasteboard.general


        In the view controller, you can add an observer to observe when something is copied to the pasteboard.



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




        In the above pasteboardChanged function, I get the data as HTML in order to display the copied as formatted text in a second controller in a WKWebView. You must import MobileCoreServices in order to reference the UTI kUTTypeHTML. To see other UTI's, please see the following link: Apple Developer - UTI Text Types



        import MobileCoreServices


        In your original question, you mentioned you want to put the copied content into a second textview. If you want to keep the formatting, you will need to get the copied data as RTFD then convert it to an attributed string. Then set the textview to display the attributed string.



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




        Because I don't know your exact project or use case so you may need to alter the code a little but I hope I provided you with pieces you need for project. Please comment if there's anything I missed.






        share|improve this answer













        Swift 4



        You can access the general pasteboard with the following line:



        let generalPasteboard = UIPasteboard.general


        In the view controller, you can add an observer to observe when something is copied to the pasteboard.



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




        In the above pasteboardChanged function, I get the data as HTML in order to display the copied as formatted text in a second controller in a WKWebView. You must import MobileCoreServices in order to reference the UTI kUTTypeHTML. To see other UTI's, please see the following link: Apple Developer - UTI Text Types



        import MobileCoreServices


        In your original question, you mentioned you want to put the copied content into a second textview. If you want to keep the formatting, you will need to get the copied data as RTFD then convert it to an attributed string. Then set the textview to display the attributed string.



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




        Because I don't know your exact project or use case so you may need to alter the code a little but I hope I provided you with pieces you need for project. Please comment if there's anything I missed.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 19 '18 at 18:31









        olearyj234olearyj234

        450615




        450615



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53281885%2fios-swift-how-to-access-selected-text-in-wkwebview%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            How to read a connectionString WITH PROVIDER in .NET Core?

            In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

            Museum of Modern and Contemporary Art of Trento and Rovereto